Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - OOP Frage


knittel - Sa 23.10.10 11:34
Titel: OOP Frage
Hallo allerseits,
Ich habe ein Überklasse TGameObject die alle Spiel Objekte beinhaltet.

Delphi-Quelltext
1:
2:
3:
TGameObject = class
  public
    procedure DrawUnit (); virtualabstract;


Dann gibt es eine weitere Unterkategorie TUnit. Die TUnit, weiß bereits wie sie gezeichnet wird.

Delphi-Quelltext
1:
2:
3:
TUnit = class (TGameObject)
  public
    procedure DrawUnit (); override;


Allerdings gibt es noch eine Unterklasse TAirUnit, die eine Ausnahme ist und wieder anders gezeichnet werden soll (mit Schatten).

Delphi-Quelltext
1:
2:
3:
TAirUnit = class (TUnit)
  public
    procedure DrawUnit (); override;


Jetzt meine Frage:
Ist es möglich die procedure in TUnit sowohl virtual zu machen als auch mit override zu versehen?

Es wäre zwar möglich TAirUnit einfach von TGameObject erben zu lassen. Allerdings beinhaltet TAirUnit sehr viele Werte, Funktionen und Procedures die TUnit auch besitzt.

Danke im vorraus.


bummi - Sa 23.10.10 12:57

wieso mit override mach sie doch einfach virtual


knittel - Sa 23.10.10 13:53

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
wieso mit override mach sie doch einfach virtual

Meine Frage ist doch, ob ich sie sowohl overriden als auch virtual machen kann.


SvenAbeln - Sa 23.10.10 14:32

user profile iconknittel hat folgendes geschrieben Zum zitierten Posting springen:

Meine Frage ist doch, ob ich sie sowohl overriden als auch virtual machen kann.

Wieso willst du sie denn noch einmal virtual machen? Deine Prozedur ist doch in TGameObject schon virtuell, durch ein override ändert sich das nicht.


delfiphan - Sa 23.10.10 14:38

Ein override ist sozusagen automatisch immer auch ein virtual.


bummi - Sa 23.10.10 14:59

wenn Du sie in Gameobject nur virtual mit einer Dummyimplementierung deklarierst sparst Du Dir die AbstractFehler und implementierst nur wo Du es brauchst.
Zu Deiner ursprünglichen Frage, zumindest unter Delphi 2010 geht es nicht.


jaenicke - Sa 23.10.10 18:01

user profile iconknittel hat folgendes geschrieben Zum zitierten Posting springen:
Meine Frage ist doch, ob ich sie sowohl overriden als auch virtual machen kann.
Nein, die Frage ist wieso du meinst sie wäre nicht mehr virtuell.

Was funktioniert denn nicht? So wie du es oben hast, sieht doch alles richtig aus.


knittel - So 24.10.10 09:25

Erstmal Danke an alle die geschrieben haben.

Ich wusste nur nicht das ein override auch automatisch virtual ist. Und ich war mir nicht sicher ob das so wie ich das hatte das auch korrekt funktionieren wird. Deswegen habe ich nachgefragt.


jaenicke - So 24.10.10 10:50

Das Schlüsselwort bewirkt, dass die Methode in der Virtual Method Table landet, wo diese dann überschrieben werden kann. Dort steht dann die aktuell aufzurufende Methode drin.

Wenn die Methode einmal dort steht, dann kann die auch nicht durch ein Überschreiben wieder dort verschwinden, denn genau dieses Überschreiben passiert dort.