AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Interface aus bestehenden Klassen erstellen
Thema durchsuchen
Ansicht
Themen-Optionen

Interface aus bestehenden Klassen erstellen

Ein Thema von fisipjm · begonnen am 19. Mai 2023 · letzter Beitrag vom 22. Mai 2023
Antwort Antwort
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.735 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

AW: Interface aus bestehenden Klassen erstellen

  Alt 19. Mai 2023, 13:48
Da ich aber eigentlich so gut wie immer die Delphi eigenen klassen verwende, sowas wie Tinifile oder TRegistry, kann ich diese ja nicht von einem IInterfacedObject ableiten. WIe stell ich das an, für bestehende Klassen ein Interface zu erstellen? Oder muss ich immer eine eigene KLassenableitung erstellen? Ich hoffe die Frage ist nicht zu Kindergarten, aber meine bisherige Websuche hat mich irgenwie nicht wirklich schlauer gemacht
Dazu habe ich vor vielen Jahren mal was geblogt:

Zitat:
Die Alternative könnte wie folgt aussehen:

Man deklariere eine von TInterfacedObject abgeleitete Wrapper-Klasse, welche die lästige Basisimplementation von IUnknown übernimmt und die darüber hinausgehende Implementation von ISomeInterface an TSomeClass delegiert:

Delphi-Quellcode:
type
  TSomeWrapper = class(TInterfacedObject, ISomeInterface)
  protected
    fSomeClass: TSomeClass;
    property SomeClass: TSomeClass read fSomeClass implements ISomeInterface;
  public
    constructor Create(_SomeClass: TSomeClass);
    destructor Destroy; override;
  end;

...

constructor TSomeWrapper.Create(_SomeClass: TSomeClass);
begin
  inherited Create;
  fSomeClass := _SomeClass;
end;

destructor TSomeWrapper.Destroy;
begin
  fSomeClass.Free;
  inherited;
end;
Benutzt wird dieses Objekt wie folgt:

Delphi-Quellcode:
var
  SomeInt: ISomeInterface;
...
  SomeInt := TSomeWmapper.Create(TSomeClass.Create);
  SomeInt.Method1;
...
Man erzeugt also eine Instanz von TSomeWrapper, übergibt ihr eine ebenfalls frisch erzeugte Instanz von TSomeClass, und verwendet sie als ob es sich um eine auf magische Weise auch von TInterfacedObject abgeleitete Version von TSomeClass handelte, weist sie z.B. auf eine Variable vom Typ ISomeInterface zu. Reference-Counting natürlich inklusive.
http://www.dummzeuch.de/delphi/objec...%20L%C3%B6sung
Thomas Mueller

Geändert von dummzeuch (19. Mai 2023 um 13:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.587 Beiträge
 
Delphi 12 Athens
 
#2

AW: Interface aus bestehenden Klassen erstellen

  Alt 19. Mai 2023, 14:15
"Eine" Klasse kann mehrere Interfaces implementieren.
mit bissl gefummel geht es sogar, wenn das Interfaces mit gleichnamigen Methoden sind. (es ist möglich quasi den Methodenname vom Interface in der Klasse anders zu bennennen, falls es konflikte gibt)
class TYourClass = class(TYourBase, IInterface1, IInterface2, ...)

Man kann Interfaces auch voneinander ableiten, also z.B. die zweite Version eines Interfaces (mit neuen Methoden), aber wo die Alten auch drin sind,
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
350 Beiträge
 
Delphi 12 Athens
 
#3

AW: Interface aus bestehenden Klassen erstellen

  Alt 19. Mai 2023, 15:04
"Eine" Klasse kann mehrere Interfaces implementieren.
mit bissl gefummel geht es sogar, wenn das Interfaces mit gleichnamigen Methoden sind. (es ist möglich quasi den Methodenname vom Interface in der Klasse anders zu bennennen, falls es konflikte gibt)
class TYourClass = class(TYourBase, IInterface1, IInterface2, ...)

Man kann Interfaces auch voneinander ableiten, also z.B. die zweite Version eines Interfaces (mit neuen Methoden), aber wo die Alten auch drin sind,

Hey Himitsu,
danke für deine Antwort, dann müsste ich mir aber immer wie in der Frage schon dangedeutet eine eigene Klasse ableiten. Und dann logischerweise auch die Interface deklaration mit der ageleiteten Klasse und nicht der Basisklasse machen. Das würde ich gern umgehen

Danke aber für den Code, jedes bisschen hilft beim lernen.
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
350 Beiträge
 
Delphi 12 Athens
 
#4

AW: Interface aus bestehenden Klassen erstellen

  Alt 19. Mai 2023, 15:07
Da ich aber eigentlich so gut wie immer die Delphi eigenen klassen verwende, sowas wie Tinifile oder TRegistry, kann ich diese ja nicht von einem IInterfacedObject ableiten. WIe stell ich das an, für bestehende Klassen ein Interface zu erstellen? Oder muss ich immer eine eigene KLassenableitung erstellen? Ich hoffe die Frage ist nicht zu Kindergarten, aber meine bisherige Websuche hat mich irgenwie nicht wirklich schlauer gemacht
Dazu habe ich vor vielen Jahren mal was geblogt:

Zitat:
Die Alternative könnte wie folgt aussehen:

Man deklariere eine von TInterfacedObject abgeleitete Wrapper-Klasse, welche die lästige Basisimplementation von IUnknown übernimmt und die darüber hinausgehende Implementation von ISomeInterface an TSomeClass delegiert:

Delphi-Quellcode:
type
  TSomeWrapper = class(TInterfacedObject, ISomeInterface)
  protected
    fSomeClass: TSomeClass;
    property SomeClass: TSomeClass read fSomeClass implements ISomeInterface;
  public
    constructor Create(_SomeClass: TSomeClass);
    destructor Destroy; override;
  end;

...

constructor TSomeWrapper.Create(_SomeClass: TSomeClass);
begin
  inherited Create;
  fSomeClass := _SomeClass;
end;

destructor TSomeWrapper.Destroy;
begin
  fSomeClass.Free;
  inherited;
end;
Benutzt wird dieses Objekt wie folgt:

Delphi-Quellcode:
var
  SomeInt: ISomeInterface;
...
  SomeInt := TSomeWmapper.Create(TSomeClass.Create);
  SomeInt.Method1;
...
Man erzeugt also eine Instanz von TSomeWrapper, übergibt ihr eine ebenfalls frisch erzeugte Instanz von TSomeClass, und verwendet sie als ob es sich um eine auf magische Weise auch von TInterfacedObject abgeleitete Version von TSomeClass handelte, weist sie z.B. auf eine Variable vom Typ ISomeInterface zu. Reference-Counting natürlich inklusive.
http://www.dummzeuch.de/delphi/objec...%20L%C3%B6sung

Hey Dumuzeuch,

das ist ja echt schon ewig her. Da sieht man mal was es alles aufzuholen gilt
Deine Lösung gefällt mir gut, ich versuch mal mein Glück. Danke!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.587 Beiträge
 
Delphi 12 Athens
 
#5

AW: Interface aus bestehenden Klassen erstellen

  Alt 19. Mai 2023, 15:13
Jupp, ableiten.
Dann bleibt nur noch der Wrapper drumrum.

Viele Klassen haben zwar bereits ein "Interface" drin (z.B. alles was von TPersistent/TComponent abgeleitet ist),
aber das, was du wissen willst, würde dort wohl fehlen.
Ein Therapeut entspricht 1024 Gigapeut.
  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:59 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