Autor Beitrag
Ritzeratze
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101



BeitragVerfasst: So 26.01.14 14:29 
Moin,

und wieder mal ein Verständnisproblem.

Ich habe ein Quelltextfragment:
Es wird ein Array für Instanzen der Klasse Pferd erzeugt und ruft für jedes Element im Array die Ausgeben Methode auf.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
Pferd[] Pferdeliste = new Pferd[2];
Pferdeliste[0] = new Pferd (200,3);
Pferdeliste[1] = new ElternPferd (700,2,40);

foreach (Pferd testPferd in Pferdeliste)
    testPferd.Ausgeben();

Die Klasse ElternPferd ist von der Klasse Pferd abgeleitet und verfügt über eine eigenen Methode Ausgeben, die die Ausgeben Methode der Basisklasse überschreiben soll.
Die Ausgeben Methode der abgeleiteten Klasse ist aber nicht mit override markiert.
Ab jetzt bin ich unsicher, ob ich die Basisklasse tatsächlich so überschreiben kann?
Soweit ich das verstanden habe, kann ich diese nur überschreiben, wenn ich sie mit override oder virtual kennzeichne.
Wie würden denn die vollständigen Namen der Methoden heißen, die ich in der Schleife aufrufe (Also Klassenname.Methode)?

Gruss Ritze der gerne C# lernen möchte.

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 26.01.14 15:13 
Hallo,

solange die Basismethode nicht mit virtual deklariert ist, so wird bei einem Aufruf dieser Methode immer auch nur exakt diese Methode aufgerufen.
Du mußt bei Objekten zwischen dem statischen und dynamischen Typ unterscheiden: in deinem Fall ist Pferd der statische Typ der beiden Objekte in dem Array, während die beiden dynamischen (d.h. wirklich zur Laufzeit vorliegenden) Typen Pferd sowie ElternPferd sind (wobei der Name hier jetzt unglücklich gewählt ist, denn normalerweise erbt ein Kind ja von seinen Eltern - nicht andersherum!).

Es wird also in deinem Code innerhalb der Schleife in beiden Fällen die Pferd.Ausgeben()-Methode aufgerufen.

Daher macht (öffentliche) Vererbung auch nur Sinn, wenn mindestens eine Methode (der Basisklasse) als virtual deklariert ist, damit abgeleitete Klassen diese Methoden mittels override überschreiben können.

P.S: In C# muß man bei abgeleiteten Klassen explizit override benutzen, dies ist aber nicht bei allen objektorientierten Sprachen so (z.B. in C++, wo man dann sogar nur das Schlüsselwort virtual optional angeben kann).
Ritzeratze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101



BeitragVerfasst: So 26.01.14 21:37 
Hi Th69,

ich glaube ich brauch jetzt ne Flasche Rotwein. Bin gerade an einem Punkt, wo ich nicht mehr mitkomme.
Werde das ganze nochmal sacken lassen und mich dann noch einmal mit Vererbung auseinandersetzen.
Gibt es eigentlich irgendwo auf dieser Welt ein einfaches Tutorial, mit dem man Vererbung gründlich lernen kann?

Danke aber für Deine hilfreichen Worte, die mir es zumindest etwas verständlicher darstellen konnten.


Gruss Ritze
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 26.01.14 22:23 
Hallo,

evtl. helfen dir
Programmieren in C#: Einführung (Kapitel 4 Klassenhierarchien)
Guide to C#: Vererbung
Ritzeratze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101



BeitragVerfasst: Mo 03.02.14 00:52 
Danke für die Infos