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.