Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Abstrakter Vorfahr + Interface gemeinsam (https://www.delphipraxis.net/209513-abstrakter-vorfahr-interface-gemeinsam.html)

ISMIRSCHLECHT 15. Dez 2021 14:14

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

freimatz 15. Dez 2021 14:24

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?

Fritzew 15. Dez 2021 14:37

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.

BerndS 15. Dez 2021 14:41

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;

DeddyH 15. Dez 2021 15:24

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.

BerndS 15. Dez 2021 16:15

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:

geht das...
sein sollte.

ISMIRSCHLECHT 16. Dez 2021 06:19

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

mjustin 16. Dez 2021 07:53

AW: Abstrakter Vorfahr + Interface gemeinsam
 
Zitat:

Zitat von ISMIRSCHLECHT (Beitrag 1499194)
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

Was spricht denn dagegen die Basisklasse von TInterfaced... abzuleiten? Denn sonst ist jede abgeleitete Klasse zur Implementierung der Referenzzählung verpflichtet. Was dem Implementierer Aufwand bereitet und Fehlermöglichkeiten schafft.

DeddyH 16. Dez 2021 09:04

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:08 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