Entwickler-Ecke

Sonstiges (.NET) - Auswahl aus mehreren Klassen


daniel1mtb - Mi 24.02.16 19:15
Titel: Auswahl aus mehreren Klassen
Hallo Zusammen,

hab eine frage bezüglich Klassen. Als beispiel:
Ich habe eine Klasse "Tier" diese vererbt an 10 weitere Klassen "Löwe", "Tiger", "Reh" ....(usw.) ihere eigenschaften.
So jetzt kann man zu beginn meines Programms eins dieser Tiere auswählen.

Je nach dem welches man gewählt hat, hat man jetzt eins dieser Tiere auf dem Bildschirm mit den zugehörigen Daten blablabla.

Wie mach ich das jetzt im meinem Code elegant sodas ich nicht 10 if abfragen habe welches Tier gewählt wurde sondern das irgendwie nur die zugehörige Klasse übergeben wird.


Hoffentlich versteht Ihr mein Problem^^

Vielen dank im vorraus.


jfheins - Mi 24.02.16 19:51

Guten Abend :)

Der Inhalt, der in diesen if-Abfragen käme, wird in die Klassen hinein verlagert. In der Basisklasse wird die Methode oder Property vordefiniert oder abstrakt deklariert, und dann in den anderen Klassen überschrieben.

Also im einfachsten Fall statt

C#-Quelltext
1:
2:
3:
4:
5:
if Tier is Reh
    name = 'Reh';
else if Tier is Hirsch
    name = 'Hirsch';
else if ...

sowas hier:

C#-Quelltext
1:
name = Tier.Name;                    

Durch das überschreiben (Schlüsselwort override) wird dann automatisch die richtige Property ausgelesen


daniel1mtb - Mi 24.02.16 20:51

Oki vielen Dank! :) Hört sich schon mal viel versprechent an^^

Werd es mal aus probieren.


FinnO - Mi 24.02.16 21:07

Moin,

ich würde das in der Regel als interface umsetzen, da eine Klasse mehrere Interfaces implementieren, jedoch nur von einer einzigen (abstrakten) Klasse abgeleitet sein kann. Das Verhalten,
welches hier ausgenutzt wird, nennt man übrigens Polymorphie :idea:. Da in C# auch Eigenschaften über Interfaces definiert werden können, gibt es regelmäßig keinen Grund, abstrakte Klassen zu verwenden.

Ich habe da mal was vorbereitet:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
using System;

namespace PolymorphDemo
{
    interface ITier
    {
        string Name { get; }
    }

    class Hirsch : ITier
    {
        public string Name
        {
            get
            {
                return nameof(Hirsch);
            }
        }
    }

    class Giraffe : ITier
    {
        public string Name
        {
            get
            {
                return nameof(Giraffe);
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ITier g = new Giraffe();
            ITier h = new Hirsch();

            Console.WriteLine(g.Name);
            Console.WriteLine(h.Name);

            Console.ReadLine();
        }
    }
}


Viele Grüße


Ralf Jansen - Mi 24.02.16 21:42

Zitat:
Hoffentlich versteht Ihr mein Problem^^


Vermutlich nicht.

Zitat:
Je nach dem welches man gewählt hat, hat man jetzt eins dieser Tiere auf dem Bildschirm mit den zugehörigen Daten blablabla.

Wie mach ich das jetzt im meinem Code elegant sodas ich nicht 10 if abfragen habe welches Tier gewählt wurde sondern das irgendwie nur die zugehörige Klasse übergeben wird.


Das kannst du vielleicht mit ein bisschen Code für uns verdeutlichen. Für mich ist die UI bereits mit einer Instanz von "Löwe", "Tiger", "Reh" verknüpft du hast also bereits eine wenn du in der UI etwas auswählst.
Wenn du die weitergeben willst gibst du die halt als Parameter des Typ Tier weiter. Es sind ja alles Ableitung von Tier. Ich sehe also gar kein Problem das es zu lösen gibt nachdem du fragst.

Also zeig was du da hast und am besten was du in der UI hast an Code und an wenn du das warum weitergeben willst.


daniel1mtb - Mi 24.02.16 22:18

@FinnO
Vielen dank für deine umfrangreiche Antwort! Dein Code werd ich auch mal testen sieht mir auch sehr schlüssig aus. :)

Meine Frage hat sich somit geklärt vielen dank!!