![]() |
Mehrfach-Vererbung, .NET und Delphi 8
Hi DPler,
die Info, welche jetzt kommt basiert auf einem Artikel von John Kaster und Danny Thorpe (beide Borland) aus dem BDN: ![]() 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. :P
Delphi-Quellcode:
Soweit, so gut. Das geht auch schon mit den aktuellen Versionen von Delphi (seit D3).
// eine Standard INTERFACE Deklaration in Delphi
type IFoo = interface procedure Hello; procedure Walk; end; IBar = interface procedure Hello; procedure Talk; end;
Delphi-Quellcode:
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 :D)
// jetzt die Neuheit
type ICombo = interface(IFoo, IBar) procedure ChewBubbleGum; end; 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:
Stellen wir uns vor, dass jetzt drei Variablen existieren und wie folgt initialisiert sind.
TMyClass = class(TObject, ICombo)
procedure Hello; // bound to IFoo.Hello and IBar.Hello by default procedure Walk; procedure Talk; procedure ChewBubbleGum; end;
Delphi-Quellcode:
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.
var
I: ICombo; F: IFoo; X: TMyClass; begin X := TMyClass.Create; F := X; I := X;
Delphi-Quellcode:
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.
F.Hello;
F.Walk;
Delphi-Quellcode:
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.
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; 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. ...:cat:... |
Hallo sakura
könntest du mal erklären was das für einen praktischen Nutzen hat? |
An den Haaren herbeigezogen, aber hoffentlich leicht zu verstehen.
Dein Programm bietet die Möglichkeit von externen Erweiterungen (wie z.B. auch der Windows Explorer). In Version 1 gibst Du lediglich die Möglichkeit das Menü zu (IMenuExtension) erweitern. In Version 2 gibst Du separat die Möglichkeit auch die Toolbars (IToolbarExtension) zu erweitern. Wenn ein Entwickler beide Bereiche mit einer Komponente erweitern will, muss dieser beide Interfaces einbinden. Da beide Interface z.B. eine Hint Eigenschaft bieten und eine Caption-Eigenschaft bieten, müssen die beiden Methoden, obwohl gleich, zweimal eingebunden werden. Nun machst Du es mit den neuen Möglichkeiten dem Entwickler leichter und definierst ein gesamtes Interface (IGUIExtension), welches beide Interfaces implementiert. Der Entwickler muss jetzt nur noch das Gesamt-Interface integrieren, ohne sich daran zu erinnern (nachzulesen) welche Interfaces alle nötig sind, damit alles funktioniert :) Es ist also für den Entwickler leichter, da er nur noch "ein" Interface berücksichtigen muss und für Dich, da die Support-Anrufe zurückgehen wegen schlecht beschriebener Schnittstellen. Ausserdem muss der Entwickler der Erweiterung nur noch eine Methoden-Implementierung für gleiche Aufgaben (z.B. Hint, Caption, Execute) schreiben. ...:cat:... |
Also erst mal danke, das Beispiel war wirklich einfach zu verstehen.
Jetzt hab ich aber noch eine zweite Frage: Warum führt I.Hello; zu einem Syntaxfehler? Die Klasse besitzt doch nur eine Implementierung für die Hello-Methode. |
I ist ja nicht von Typ TMyClass sondern von Typ ICombo. ICombo war definiert als
Delphi-Quellcode:
und erbt daher die Methoden von IFoo und IBar. Sowohl IFoo als auch IBar deklarieren die Methode Hello. Ein Aufruf von I.Hello wäre jetzt nicht eindeutig. Ist jetzt IFoo.Hello oder IBar.Hello gemeint. Dabei ist es uninteressant, das beide Methoden in der Klasse TMyClass auf die selbe Methode verweisen, da das auch weiterhin nicht zwingend der Fall ist. TMyClass könnte theoretisch auch wie folgt deklariert sein, dadurch würde jedes Interface eine eigene Methode innerhalb von TMyClass "besitzen".
type
ICombo = interface(IFoo, IBar) procedure ChewBubbleGum; end;
Delphi-Quellcode:
TMyClass = class(TObject, ICombo)
procedure IFoo.Hello = FooHello; procedure IBar.Hello = BarHello; procedure FooHello; procedure BarHello; procedure Walk; procedure Talk; procedure ChewBubbleGum; end; |
Danke jetzt hab ichs verstanden.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz