Hi DPler,
die Info, welche jetzt kommt basiert auf einem Artikel von John Kaster und Danny Thorpe (beide Borland) aus dem
BDN:
http://bdn.borland.com/article/0,1410,29779,00.html
Das letzte Update für den Delphi.NET Preview Compiler stellt uns die Möglchkeit der Mehrfachvererbung von
interface-Deklarationen vor. Für Delphi eine absolute Neuheit und aus meiner Sicht ein lang ersehntes und endlich greifbar nahes Feature.
Delphi-Quellcode:
// eine Standard INTERFACE Deklaration in Delphi
type
IFoo = interface
procedure Hello;
procedure Walk;
end;
IBar = interface
procedure Hello;
procedure Talk;
end;
Soweit, so gut. Das geht auch schon mit den aktuellen Versionen von Delphi (seit D3).
Delphi-Quellcode:
// jetzt die Neuheit
type
ICombo = interface(IFoo, IBar)
procedure ChewBubbleGum;
end;
Das Interface ICombo erbt jetzt die Deklarationen von beiden Interfaces, IFoo
und IBar, ausserdem definiert es noch die Methode ChewBubbleGum (ich möchte den Computer sehen
)
Wer sich mit Interfaces schon ein wenig beschäftigt hat, der weiss, das man mit den Deklarationen selbst nicht viel anfangen kann, diese müssen jetzt noch in eine Klasse implementiert werden. Bis einschl. D7 musste man, wenn von mehreren Interfaces geerbt wurde, welche je einen identischen Methodennamen (im Bsp.:
Hello;) implementierten diesen auf zwei verschiedene Methoden casten (verteilen). Das ist auch nicht mehr nötig. Folgende Implementierung in eine Klasse ist daher möglich.
Delphi-Quellcode:
TMyClass = class(TObject, ICombo)
procedure Hello; // bound to IFoo.Hello and IBar.Hello by default
procedure Walk;
procedure Talk;
procedure ChewBubbleGum;
end;
Stellen wir uns vor, dass jetzt drei Variablen existieren und wie folgt initialisiert sind.
Delphi-Quellcode:
var
I: ICombo;
F: IFoo;
X: TMyClass;
begin
X := TMyClass.Create;
F := X;
I := X;
X zeigt auf ein Object der Klasse
TMyClass. Da die Klasse die beiden Interfaces IFoo und ICombo implementiert, können diese jetzt auf die entsprechenden Variablen (intern Pointer) zugewiesen werden. Da
F vom Typ
IFoo ist, kann folgender Code problemlos geschrieben werden.
Für
I, vom Typ
ICombo gestalltet sich das schon etwas umständlicher. Der Aufruf
I.Hello ist nicht mehr eindeutig, da es für den Compiler nicht ersichtlich ist, ob die Methode Hello von
IFoo oder
IBar gemeint ist. Nach der Delphi-üblichen Manier muss hier also ein Typ-Cast durchgeführt werden.
Delphi-Quellcode:
I.Hello; // syntax error: ambiguous call (IFoo.Hello and IBar.Hello)
IBar(I).Hello; // ok
(I as IBar).Hello; // ok
I.Walk;
I.Talk;
I.ChewBubbleGum;
Voraussichtlich wird die Mehrfachvererbung nur für Interfaces funktionieren, welche von
IInterface erben, aber nicht für Interfaces welche von
IUnknown erben, um den Einschränkungen von Microsoft (z.B.
IInterface und
IInterface2) auszuweichen.
Das steht jedoch erst mirt dem Erscheinen von Delphi 8 bzw. der endgültigen Delphi.NET Version fest.
Weitergehende Informationen sind in oben genannten Artikel zu finden. Viel Spass mit der neuen Preview des .NET Compiler für Delphi.
...
...