Autor Beitrag
daniel1mtb
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 24.02.16 19:15 
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: 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
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
if Tier is Reh
    name = 'Reh';
else if Tier is Hirsch
    name = 'Hirsch';
else if ...

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

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


Zuletzt bearbeitet von jfheins am Mi 24.02.16 21:36, insgesamt 1-mal bearbeitet
daniel1mtb Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 24.02.16 20:51 
Oki vielen Dank! :) Hört sich schon mal viel versprechent an^^

Werd es mal aus probieren.
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: 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:
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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!!