Guten Morgen alle zusammen
,
ich arbeite momentan sehr viel mit Objekten und
COM Interfaces. Da ich mir als Ziel gesetzt habe, wirlich sauberes
OOP zumachen gibt es einige Probleme. Der Compiler macht nicht mit, genauer er erkennt die Polymorphie nicht. Folgenes Beispiel:
Objekt A besitzt die virtuelle abstrakte Methode XYZ, die das Interface C zurück gibt.
Objekt B, abgeleitet von Objekt A, überschreib die Methode XYZ, gibt allerdings Interface D, welches von Interface C abgeleitet ist zurück.
In meinen Augen ist das keine Verletzung der Regeln, da Interface D auch ein vollwertiges Interface C ist. Somit gibt die Funktion XYZ immer ein Interface C zurück, allerdings manchmal mehr als nur C.
Trozdem beschwert sich der Compiler: "There is no method in an ancestor to override". Ich habe das Problem jetzt mit reintroduce "gelöst", bzw. rein gewaschen, wirlich sauber ist das ja nicht, eine Methode einer zu streichen und was anderes hinschreiben, das ähnelt eher dem Overload als einer abstrakten Vererbung.
Fehlende "virtual"- oder "abstract"-Statements habe ich mehrmals ausgeschlossen.
Gibt es da wirklich keine Möglichkeit? Mit ordinalen Typen geht es ja auch, warum also nicht mit Interfaces und Classes, die im Prizip auch nur ordinal sind ( Pointer afaik ).
Für die, die den Beweis brauchen:
Delphi-Quellcode:
type
TSubKlasse =
class(TObject);
TTopKlasse =
class(TSubKlasse);
TElternKlasse =
class(TObject)
public
function Test : TSubKlasse;
virtual;
abstract;
end;
TKind1Klasse =
class(TElternKlasse)
public
// TTopKlasse ist ein TSubKlasse, also gültig.
function Test : TTopKlasse;
override;
end;
TKind2Klasse =
class(TElternKlasse)
public
// So gehts auch, mit brachialer Überschreibgewalt.
function Test : TTopKlasse;
reintroduce;
end;
TKind3Klasse =
class(TElternKlasse)
public
// Allerdings auch so, was nicht OOP ist.
function Test(Param1 : Integer) : TTopKlasse;
reintroduce;
end;
Naja hoffentlich gibts eine
schöne Lösung, denn Code muss nicht nur funktionieren, Code muss gut aussehen, Code muss eine Persönlichkeit haben, Code muss Leben & Atmen... ^^
Gute Nacht! xD