![]() |
Delphi-Version: 10.4 Sydney
Abstrakter Vorfahr + Interface gemeinsam
Guten Tag,
wie kann ich Klassen von - einer abstrakten Basisklasse UND - einem Interface ableiten ? Geht das überhaupt ? Gruß ism |
AW: Abstrakter Vorfahr + Interface gemeinsam
Das geht nicht. Ein Klasse kann nur von einer Klasse ableiten.
Eine Klasse kann ein interface implementieren aber nicht ableiten. Vielleicht meinst Du aber was anderes. Beispiel? |
AW: Abstrakter Vorfahr + Interface gemeinsam
Etwas in die Richtung?
Delphi-Quellcode:
unit Unit24;
interface type Tabstract = class protected function getint : integer; virtual; abstract; end; IBaseInterface = Interface ['{3803EF76-0C39-4992-AD91-B2F7F6EED72E}'] end; Tconcret = class(Tabstract, IBaseInterface) private FRefCount: Integer; protected function getint: Integer; override; public function QueryInterface(const IID: TGUID; out Obj): HRESULT; stdcall; function _AddRef: Integer; stdcall; function _Release: Integer; stdcall; end; implementation { Tconcret } function Tconcret.getint: Integer; begin result := 0; end; function Tconcret.QueryInterface(const IID: TGUID; out Obj): HRESULT; begin if GetInterface(IID, Obj) then Result := 0 else Result := E_NOINTERFACE; end; function Tconcret._AddRef: Integer; begin AtomicIncrement(FRefCount) end; function Tconcret._Release: Integer; begin Result := AtomicDecrement(FRefCount); if Result = 0 then begin Destroy; end; end; end. |
AW: Abstrakter Vorfahr + Interface gemeinsam
ein ganz einfaches Beispiel:
Delphi-Quellcode:
type
IMyInterface = Interface procedure Tuwas; end; TMyAbstractClass = class(TInterfacedObject) public procedure Tuwas; virtual; abstract; end; TMyTuwas = class(TMyAbstractClass, IMyInterface) public procedure Tuwas; override; end; |
AW: Abstrakter Vorfahr + Interface gemeinsam
Was so aber nur funktioniert, wenn man die abstrakte Basisklasse entweder selbst geschrieben hat und sie daher ggf. anpassen kann oder sie von TInterfacedObject oder TInterfacedPersistent abgeleitet wurde. Ansonsten bleibt nur der Weg wie von Fritzew gezeigt.
|
AW: Abstrakter Vorfahr + Interface gemeinsam
@DeddyH
Aus diesem Grund habe ich es auch als einfaches Beispiel benannt, der Post von Fritzew ist sicher besser für den Fall, das man die Basisklasse nicht selber erstellt hat. Ich wollte mir QueryInterface, _AddRef und _Release ersparen, da es eher eine Antwort auf die Frage Zitat:
|
AW: Abstrakter Vorfahr + Interface gemeinsam
Moin,
danke erstmal für die vielen Antworten. Die von Fritzew wird es sein, dabei habe ich gleich ein paar Fragen so nebenbei beantwortet bekommen. Das eigentliche Motiv war: Wie kann ich den Implementierer einer abstrakten Basisklasse verpflichten, Funktionen zu implementieren ? Bei dem Vererbungsgemache bin ich immer noch Lernender. ism |
AW: Abstrakter Vorfahr + Interface gemeinsam
Zitat:
|
AW: Abstrakter Vorfahr + Interface gemeinsam
Wenn die abstrakte Klasse nicht von einem selbst stammt, kann man ja immer noch eine weitere Klasse davon ableiten, die TInterfacedObject "simuliert", wie Fritzew gezeigt hat. Die nimmt man dann einfach als Basis für weitere Ableitungen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:54 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