Einzelnen Beitrag anzeigen

Benutzerbild von Desmulator
Desmulator

Registriert seit: 3. Mai 2007
Ort: Bonn
169 Beiträge
 
#1

Polymorphie bei Methodenrückgabewerten

  Alt 29. Mär 2009, 01:14
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
Lars
There are 10 kinds of people in the world:
those who get binary, and those who don’t.
  Mit Zitat antworten Zitat