Einzelnen Beitrag anzeigen

Dejan Vu
(Gast)

n/a Beiträge
 
#20

AW: Vererbung und Polymorphie

  Alt 19. Dez 2014, 06:46
Also ich soll mit einer Liste arbeiten, nämlich: Menschlist: TObjectList<TMensch>
Diese möchte ich befüllen, mit den Inhalten, die aus den Editfelder in einem anderen Formular ausgelesen werden.
Gut. Erste Zeile ist schon klar (im Button-Click-Handler)
Delphi-Quellcode:
//
Menschlist.Add (ErzeugeNeuenMenschen());
//
Zitat:
Ich möchte diese ausgefüllten Sachen in eine Variable von TMensch schreiben, was aber nicht geht, da ich ja zum Beispiel nicht "Mensch.FSchulform" abfragen kann,
weil TMensch diese Variable nicht kennt. Dies soll nach dem Schema gehen, welches ich versucht habe mit den Schachfiguren zu verdeutlichen, aber ich schaffe es nicht.
Delphi-Quellcode:
Function TForm1.ErzeugeNeuenMenschen() : TMensch;
Begin
  Case WelcherMenschSollErzeugtWerden of
    Arbeiter :
      Result := ErzeugeArbeiter();
    Schueler :
      Result := ErzeugeSchueler();
   ....
  End;
// Hier noch die allen Menschen gemeinsamen Eigenschaften setzen
End;

Function TForm.ErzeugeArbeiter() : TArbeiter;
Begin
  Result := TArbeiter.Create;
  Result.StundenLohn := StrToFloat(EditFeldStundenLohn.Text);
  Result.IstChef := CheckBoxIstChef.Checked;
End;

Function TForm.ErzeugeSchueler() : TSchueler;
Begin
  Result := TSchueler.Create;
  Result.Schulform := ....
End;
Du erzeugst also konkrete Menschableitungen und setzt deren explizite Eigenschaften.
Jeder Schüler und jeder Arbeiter ist auch ein Mensch, aber nicht umgekehrt. Schau Dir genau die Deklaration an. Das passt so. Die Variable 'Result' (das Funktionsergebnis) ist vom Typ 'TMensch'. Ich kann ihr aber einen TArbeiter oder TSchueler zuweisen. In der Funktion 'ErzeugeSchueler' ist das Funktionsergebnis hingegen ein 'TSchueler'.

Da du der abstrakten Basisklasse 'TMensch' noch eine virtuelle Methode 'ToString' spendierst, und die dann in allen Kindklassen überschreibst bzw. erweiterst, solltest Du dann damit durch sein.

Geändert von Dejan Vu (19. Dez 2014 um 06:51 Uhr)
  Mit Zitat antworten Zitat