AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Mehrfach-Vererbung, .NET und Delphi 8

Ein Thema von sakura · begonnen am 26. Feb 2003 · letzter Beitrag vom 26. Feb 2003
Antwort Antwort
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#1

Mehrfach-Vererbung, .NET und Delphi 8

  Alt 26. Feb 2003, 09:23
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.
Delphi-Quellcode:
   F.Hello;
   F.Walk;
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.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
lodda

Registriert seit: 6. Dez 2002
65 Beiträge
 
Delphi 5 Standard
 
#2
  Alt 26. Feb 2003, 10:11
Hallo sakura

könntest du mal erklären was das für einen praktischen Nutzen hat?
Die 3 größten Lügen der Software- Entwickler:
1. Dieses Feature ist noch nicht implementiert, aber das ist kein Problem dies zu tun.
2. Wir arbeiten an einem Update um den Fehler zu beseitigen.
3. Ihre Software wird nächste Woche fertig sein.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#3
  Alt 26. Feb 2003, 10:32
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.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
lodda

Registriert seit: 6. Dez 2002
65 Beiträge
 
Delphi 5 Standard
 
#4
  Alt 26. Feb 2003, 10:44
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.
Die 3 größten Lügen der Software- Entwickler:
1. Dieses Feature ist noch nicht implementiert, aber das ist kein Problem dies zu tun.
2. Wir arbeiten an einem Update um den Fehler zu beseitigen.
3. Ihre Software wird nächste Woche fertig sein.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#5
  Alt 26. Feb 2003, 11:21
I ist ja nicht von Typ TMyClass sondern von Typ ICombo. ICombo war definiert als
Delphi-Quellcode:
type
  ICombo = interface(IFoo, IBar)
     procedure ChewBubbleGum;
  end;
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".

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;
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
lodda

Registriert seit: 6. Dez 2002
65 Beiträge
 
Delphi 5 Standard
 
#6
  Alt 26. Feb 2003, 11:28
Danke jetzt hab ichs verstanden.
Die 3 größten Lügen der Software- Entwickler:
1. Dieses Feature ist noch nicht implementiert, aber das ist kein Problem dies zu tun.
2. Wir arbeiten an einem Update um den Fehler zu beseitigen.
3. Ihre Software wird nächste Woche fertig sein.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz