![]() |
Delphi-Version: 2010
Interfaces - Multiple Inheritance
Hallo liebe Delphi-Gemeinde,
ich habe jetzt schon etliche Artikel und Forendiskussionen dazu abgesucht, aber leider keinen Hinweis gefunden. Ich versuche, ein Interface von 2 weiteren Interfaces erben zu lassen, etwa wie folgt:
Delphi-Quellcode:
Wie bereits im Codeblock geschrieben tritt ein Fehler auf.IReadObject = Interface(IInterface) ['{26828CFB-864E-488E-914D-B4BEBD49F641}'] function getMass: Double; End; IWriteObject = Interface(IInterface) ['{B9F10F92-1145-4108-8C93-386ABA334A88}'] procedure setMass(AValue: Double); End; // Das funktioniert so leider nicht // Fehler: [DCC Fehler] E2029 ')' erwartet, aber ',' gefunden (In der Zeile "IFullObject..", Cursor steht vor ", IWriteObject)" IFullObject = Interface(IReadObject, IWriteObject) ['{19FCFAF2-1BF0-45BE-AABF-0C5138F7D7ED}'] property Mass: Double read getMass write setMass; end; Funktioniert das mehrfache Erben bei Interfaces (so wie bei Klassen) nicht? Oder mache ich etwas falsch? Mit freundlichen Grüßen, BliZZarD |
AW: Interfaces - Multiple Inheritance
Interfaces können genau wie Klassen immer nur einen Vorfahren haben. Klassen können aber mehrere Interfaces implementieren.
|
AW: Interfaces - Multiple Inheritance
Um es mal auf dein Beispiel zu beziehen:
Delphi-Quellcode:
Du kannst jetzt auch noch dies machen:
IReadObject = Interface(IInterface)
['{26828CFB-864E-488E-914D-B4BEBD49F641}'] function getMass: Double; property Mass: Double read getMass; End; IWriteObject = Interface(IInterface) ['{B9F10F92-1145-4108-8C93-386ABA334A88}'] procedure setMass(AValue: Double); property Mass: Double write setMass; End; TFullObject = class(TInterfacedObject, IReadObject, IWriteObject) private function getMass: Double; procedure setMass(AValue: Double); end;
Delphi-Quellcode:
Die implementierende Klasse muss dann das Interface nur noch aufführen.
IFullObject = Interface(IReadObject)
['{19FCFAF2-1BF0-45BE-AABF-0C5138F7D7ED}'] procedure setMass(AValue: Double); property Mass: Double read getMass write setMass; end; TFullObject = class(TInterfacedObject, IReadObject, IWriteObject, IFullObject) In diesem Fall wäre IWriteObject dann aber eigentlich überflüssig. |
AW: Interfaces - Multiple Inheritance
Nein, IReadObject ist "überlüssig"/unnötig, da es schon in IFullObject enthalten ist (der Vorfahre).
Die Funktion von IWriteObject ist zwar auch in IFullObject enthalten, aber das Interface selber natürlich nicht. |
AW: Interfaces - Multiple Inheritance
Zitat:
Delphi-Quellcode:
type
IFather = interface ['{41780D81-7DD0-491B-831D-E3C247FB425F}'] end; IChild = interface (IFather) ['{BAB88147-561D-4786-BC59-FDA90AFF3669}'] end; TClass1 = class(TInterfacedObject, IFather, IChild) end; TClass2 = class(TInterfacedObject, IChild) end; procedure Test; var intf1: IInterface; intf2: IInterface; begin intf1 := TClass1.Create; intf2 := TClass2.Create; if Supports(intf1, IFather) then ShowMessage('TClass1 supports IFather') else ShowMessage('TClass1 doesn''t support IFather'); if Supports(intf2, IFather) then ShowMessage('TClass2 supports IFather') else ShowMessage('TClass2 doesn''t support IFather'); end; |
AW: Interfaces - Multiple Inheritance
Zitat:
|
AW: Interfaces - Multiple Inheritance
Uwe hat recht. Interfaces, die nicht explizit bei einer Klasse angegeben sind bekommen keinen VMT Slot und sind demnach auch nicht über Supports verfügbar. Auch wenn sie eigentlich über eine Interface Vererbung drin sein müssten.
|
AW: Interfaces - Multiple Inheritance
Zitat:
Meinst du das Interface oder die Angabe dessen im Objekt? Aber gut zu wissen ... dachte daß auch die Interfaces supportet werden, welche als Parent indirekt mit eingebunden sind. :shock: |
AW: Interfaces - Multiple Inheritance
Ich hoffe das ist ok, dass ich das alte Thema wieder ausbuddele.
Aber genau die gleiche Frage stelle ich mir mittlerweile auch. Nochmal:
Wie kann ich überhaupt erfahren, dass
Delphi-Quellcode:
auch
TChild
Delphi-Quellcode:
supported? Müsste ich in meiner Klasse das
IParent
Delphi-Quellcode:
selbst überschreiben? Oder sollte man sich Interface-Vererbung generell abgewöhnen?
QueryInterface
|
AW: Interfaces - Multiple Inheritance
Zitat:
Übrigens: Interface-Vererbung hast du immer dabei - jedes Interface ist von IInterface abgeleitet. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19: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 by Thomas Breitkreuz