AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Abstrakter Vorfahr + Interface gemeinsam

Ein Thema von ISMIRSCHLECHT · begonnen am 15. Dez 2021 · letzter Beitrag vom 16. Dez 2021
Antwort Antwort
ISMIRSCHLECHT

Registriert seit: 17. Dez 2018
Ort: Görlitz
69 Beiträge
 
#1

Abstrakter Vorfahr + Interface gemeinsam

  Alt 15. Dez 2021, 14:14
Delphi-Version: 10.4 Sydney
Guten Tag,

wie kann ich Klassen von
- einer abstrakten Basisklasse
UND
- einem Interface ableiten ?
Geht das überhaupt ?


Gruß ism
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.380 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Abstrakter Vorfahr + Interface gemeinsam

  Alt 15. Dez 2021, 14:24
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?
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Abstrakter Vorfahr + Interface gemeinsam

  Alt 15. Dez 2021, 14:37
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.
Fritz Westermann
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
480 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Abstrakter Vorfahr + Interface gemeinsam

  Alt 15. Dez 2021, 14:41
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;
Bernd
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Abstrakter Vorfahr + Interface gemeinsam

  Alt 15. Dez 2021, 15:24
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
480 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Abstrakter Vorfahr + Interface gemeinsam

  Alt 15. Dez 2021, 16:15
@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.
Bernd
  Mit Zitat antworten Zitat
ISMIRSCHLECHT

Registriert seit: 17. Dez 2018
Ort: Görlitz
69 Beiträge
 
#7

AW: Abstrakter Vorfahr + Interface gemeinsam

  Alt 16. Dez 2021, 06:19
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
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#8

AW: Abstrakter Vorfahr + Interface gemeinsam

  Alt 16. Dez 2021, 07:53
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.
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Abstrakter Vorfahr + Interface gemeinsam

  Alt 16. Dez 2021, 09:04
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 01:13 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