Zitat:
Das schafft man auch mit einer abstrakten Basisklasse.
Aber dann könnte eine Klasse nur eine Aufgabe erfüllen/Rolle. Bei Interfaces beliebig viele.
Da grübele ich jetzt widerum, was Du genau meinst: Was meinst Du da mit 'eine Aufgabe' vs. 'beliebig viele'?
Zitat:
Das mit dem nicht instantiieren gilt auch in vielen anderen Sprachen für abstrakte Klassen ( in Delphi nur in neueren Versionen; in Delphi sind nur Methoden abstrakt).
Aber ich verstehe nicht, was du mit unsichtbar meinst.
Erklärung: Ich möchte nicht, das meine Klasse (keine abstrakte) direkt instantiiert wird. Ich verlange, das sie über eine Factory instantiiert wird. Daher muss ich die Klasse verbergen, denn sie kann ja u.U. mehr, als ich nach außen hin preisgeben will. Wenn Du also die
Unit einbindest (Assemblies gibts ja leider nicht), dann siehst Du nur das Interface und die Factory.
Delphi-Quellcode:
Unit myAssembly;
interface
Type
IMyInterface =
interface...
IInterface1 =
interface (IMyInterface)...
IInterface2 =
interface (IMyInterface)
function Factory<T : IMyInterface>() : T;
// geht das?
implementation
Type
TClass1 :
class (TInterfacedObject, IInterface1)
end;
TClass2 :
class (TInterfacedObject, IInterface2)
end;
...
end.
Hier sind die Klassen 'TClass1' und 'TClass2' unsichtbar.
Zitat:
Und das sehe ich als großen Vorteil von Interfaces an: Ich kann gleiches Verhalten in unterschiedliche Klassen bzw. Klassenmodelle "injizieren", ohne dass diese voneinander wissen müssen. Und damit kannst Du dann Code wirklich wieder verwenden...
Absolut, ich habe ja nicht gegen Interfaces gewettert.