Einzelnen Beitrag anzeigen

Benutzerbild von Desmulator
Desmulator

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

Re: Polymorphie bei Methodenrückgabewerten

  Alt 29. Mär 2009, 11:09
Danke für die Antworten,

es handelt sich wirklich um einen "Tippfehler", wie Khabarakh vermuted hatte. Ich habe es korrigiert. Die Bezeichner sollen ja nur den Sachverhalt darstellen.

Ich habe nochmal genau nachgeschaut, das Problem stellt sich nur bei vererbten Interfaces.
Beispiel :
Delphi-Quellcode:
program Project1;

{ $mode objfpc}{ $H+}

type
  ISubKlasse = interface(IInterface) end;
  ITopKlasse = interface(ISubKlasse) end;
  TSubKlasse = class(TInterfacedObject, ISubKlasse);
  TTopKlasse = class(TSubKlasse, ITopKlasse);


  TElternKlasse = class(TObject)
  public
    function Test : TSubKlasse; virtual;
    function Test2 : ISubKlasse; virtual;
  end;

  TKind1Klasse = class(TElternKlasse)
  public
    // TTopKlasse ist ein TSubKlasse, also gültig.
    function Test : TTopKlasse; override;
    function Test2 : ITopKlasse; override;
    // Diese Zeile wir bestraft mit der Meldung:
    // project1.lpr(22,14) Error: There is no method in an ancestor class to be overridden: "TKind1Klasse.Test2:ITopKlasse"
  end;

  TKind2Klasse = class(TElternKlasse)
  public
    // So gehts auch, mit brachialer Überschreibgewalt.
    function Test : TTopKlasse; reintroduce;
    function Test2 : ITopKlasse; reintroduce;
  end;

function TElternKlasse.Test : TSubKlasse;
begin
  Result := TSubKlasse.Create();
end;

function TKind1Klasse.Test : TTopKlasse;
begin
  Result := TTopKlasse.Create();
end;

function TKind2Klasse.Test : TTopKlasse;
begin
  Result := TTopKlasse.Create();
end;

function TElternKlasse.Test2 : ISubKlasse;
begin
  Result := ISubKlasse(Test);
end;

function TKind1Klasse.Test2 : ITopKlasse;
begin
  Result := ITopKlasse(Test);
end;

function TKind2Klasse.Test2 : ITopKlasse;
begin
  Result := ITopKlasse(Test);
end;

begin
end.
Lars
There are 10 kinds of people in the world:
those who get binary, and those who don’t.
  Mit Zitat antworten Zitat