![]() |
AW: Polymorphie und Interfaces in Delphi
Zitat:
Dennoch bin ich da auch auf Mikkey's Seite. Zitat:
Man verwendet die Ableitung (also die Abhängigkeit) von Interfaces ja aus einem trifftigen Grund .. und der ist für mich: jemand der das Subinterface implementiert, muss auch das Superinterface bereitstellen (implementieren). Beispiel:
Delphi-Quellcode:
Also eine Klasse die den Schreibzugriff über IObjectWriter anbietet, muss auch den Lesezugriff über IObjectReader anbieten (sonst würde der Compiler meckern aufgrund der Property).
IObjectReader = interface
GetName: String; property Name: String read GetName; end; IObjectWriter = interface(IObjectReader) SetName(const AValue: String); property Name: String read GetName write SetName; end; |
AW: Polymorphie und Interfaces in Delphi
Zitat:
Z.B. TKlasse = class(TObject, IExtendedInterface_1, IExtendedInterface_2). Welche Implementierung soll man nehmen? (Die Implementierungen können unterschiedlich delegiert sein...) Der Compiler könnte sich natürlich etwas mehr Mühe machen in eindeutigen Fällen ein passendes Interface zu suchen, aber die mit impliziten Cast verbundene Raterei verursacht eigentlich immer an unerwarteter Stelle Probleme. |
AW: Polymorphie und Interfaces in Delphi
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Von außen kann man nicht auf die Methoden des Vorfahren zugreifen. Man kommt da nur daran, wenn man die Interfaceinstanz auf den Vorfahren castet (als Typcast und nicht über Supports), wenn man weiß, daß dort etwas drin ist. Ich hatte das mal verwendet, um in der Codevervollständigung die Liste kürzer zu halten, da man in Interfaces keine private-Abschnitt deklarieren kann, worin sich Getter und Setter verstecken lassen. |
AW: Polymorphie und Interfaces in Delphi
Zitat:
|
AW: Polymorphie und Interfaces in Delphi
Zitat:
Delphi-Quellcode:
Möglicherweise könnte das aber irgendwann mal klappen, insoweit könnte Uwe Raabes Einwand gerechtfertigt sein.
unit IFTest;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type IBase = interface(IInterface) function f1(): Integer; end; IExtend1 = interface(IBase) function f2(): Integer; end; IExtend2 = interface(IBase) function f3(): Integer; end; TK1 = class(TInterfacedObject, IExtend1) function f1(): Integer; virtual; function f2(): Integer; end; TK2 = class(TK1, IExtend2) function f1(): Integer; override; function f3(): Integer; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} procedure testF(i: IBase); begin end; function TK1.f1(): Integer; begin result := 11; end; function TK1.f2(): Integer; begin result := 12; end; function TK2.f1(): Integer; begin result := 21; end; function TK2.f3(): Integer; begin result := 23; end; procedure TForm1.FormCreate(Sender: TObject); var o1: TK1; o2: TK2; i1, i2, i3: Integer; begin o1 := TK1.Create(); o2 := TK2.Create(); testF(IExtend1(o1)); testF(IExtend2(o2)); i1 := o1.f1(); i2 := o2.f1(); i3 := (TK1(o2)).f1(); ShowMessage(Format('o1: %d, o2: %d, Base(o2): %d', [i1, i2, i3])); // Ausgabe: 11 / 21 / 21 end; end. Edit: Ziehe meinen Einwand zurück, mit "reintroduce" in der TK2-Definition (anstelle "virtual"/"override") wird tatsächlich 11/21/11 ausgegeben. |
AW: Polymorphie und Interfaces in Delphi
Zitat:
|
AW: Polymorphie und Interfaces in Delphi
Zitat:
Wollte ich auch grade sagen. Stichwort "Method Resolution clause". Hier ein Beispiel:
Delphi-Quellcode:
Ein realitätsnahes Beispiel hierfür will mir aber auch nicht einfallen.
program Project4;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; type IBaseInterface = interface procedure baseMethod(); end; IChildInterface1 = interface(IBaseInterface) // Stub end; IChildInterface2 = interface(IBaseInterface) // Stub end; TMyObject1 = class(TInterfacedObject, IChildInterface1) public procedure baseMethod(); virtual; abstract; end; TMyObject2 = class(TMyObject1, IChildInterface1, IChildInterface2) procedure baseForChildInterface1(); procedure baseForChildInterface2(); procedure IChildInterface2.baseMethod = baseForChildInterface1; procedure IChildInterface1.baseMethod = baseForChildInterface2; end; { TMyObject2 } procedure TMyObject2.baseForChildInterface1(); begin WriteLn('Das ist "baseForChildInterface1()"'); end; procedure TMyObject2.baseForChildInterface2(); begin WriteLn('Das ist "baseForChildInterface2()"'); end; var iChild1Reference: IChildInterface1; iChild2Reference: IChildInterface2; objRef: TMyObject2; begin try objRef := TMyObject2.Create(); iChild1Reference := objRef; iChild2Reference := objRef; iChild1Reference.baseMethod(); iChild2Reference.baseMethod(); except on E: Exception do WriteLn(E.ClassName, ': ', E.Message); end; readln; end. |
AW: Polymorphie und Interfaces in Delphi
Zitat:
|
AW: Polymorphie und Interfaces in Delphi
Hmmm, das ist jetzt komisch.
Delphi-Quellcode:
Ich weiß jetzt nicht mehr welche Delphi-Version das war, aber damals wurde der Getter und Setter nicht ausgeblendet, was XE jetzt aber macht.
type
IMyIntf = interface function Getter: Integer; procedure Setter(i: Integer); property Prop: Integer read Getter write Setter; end;
Delphi-Quellcode:
Dafür wird im IMyIntf der Getter/Setter jetzt doch angezeigt. :gruebel:
type
IInnerMyIntf = interface function Getter: Integer; procedure Setter(i: Integer); end; IMyIntf = interface(IInnerMyIntf) function Abc: Integer; end; Hmmmmmmmmm. |
AW: Polymorphie und Interfaces in Delphi
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:04 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