Delphi-Quellcode:
INeustartbar = interface
['{C952DFE2-65A3-48A4-8681-81F97946DB5A}']
procedure restart();
end;
ISchreibenLesen = interface
['{DBAF7078-C915-471F-8C37-F679253220BE}']
procedure writeStuff();
procedure readStuff();
end;
TMessgerät = class abstract(TInterfacedObject)
end;
TMessgerät1 = class(TMessgerät, ISchreibenLesen)
procedure readStuff;
procedure writeStuff;
procedure spezialKram();
end;
TMessgerät2 = class(TMessgerät, ISchreibenLesen, INeustartbar)
public
procedure readStuff;
procedure writeStuff;
procedure spezialKram();
procedure restart();
end;
Das geht genauso. Das Interface muss man ja nicht in der Oberklasse angeben.
Delphi-Quellcode:
var
a: TMessgerät;
b: ISchreibenLesen;
begin
a := TMessgerät2.Create;
b := a as ISchreibenLesen;
b.readStuff;
end;
(Wobei das Objekt nach der Methode durch das Interface freigegeben wird.)
// EDIT:
Was mir an der vorgestellten Lösung überhaupt nicht gefällt, ist, dass man von TInterfacedObject ableiten muss. Dadurch "weiß" TMessgerät bereits, dass die abgeleiteten Klassen Interfaces nutzen werden.
Warum muss man? Man kann die notwendigen Methoden (QueryInterface, ...) auch in den Unterklassen implementieren. Ich halte das nicht für sinnvoll, kann man aber. Man verliert dann aber die Möglichkeit von der Oberklasse auf das Interface zu casten.