AGB  ·  Datenschutz  ·  Impressum  







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

Vererbung bei Implementierung eines Interfaces

Ein Thema von bernhard_LA · begonnen am 15. Jul 2018 · letzter Beitrag vom 15. Jul 2018
Antwort Antwort
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#1

Vererbung bei Implementierung eines Interfaces

  Alt 15. Jul 2018, 00:17
ich will die Funktionen eines Interfaces über verschiedene Klassen implementieren.

Delphi-Quellcode:
TMyClassA = class ( TInterfacedObject, IMyLibrary);
   ....
   ....
end;
die verschiedenen Klassen haben eine identische Funktionalität und einen Teil der eben unterschiedlich implementiert wird.
Ist es Möglich eine Verberbung auf Seiten der Interface Implementierung einzuführen ?


Delphi-Quellcode:
TMyClassRoot = class ();
   ....
   ....
end;


TMyClassA = class ( TInterfacedObject, IMyLibrary, TMyClassRoot);
   ....
   ....
end;


TMyClassB = class ( TInterfacedObject, IMyLibrary, TMyClassRoot);
   ....
   ....
end;
nur haben diese Ansätze leider nicht funktioniert .....
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Vererbung bei Implementierung eines Interfaces

  Alt 15. Jul 2018, 00:29
Ich bin mir gerade nicht mehr ganz sicher (und kann es leider auch nicht ausprobieren) ob man Interface Methoden als virtual; deklarieren kann. Wenn ja, dann könntest du es so ausprobieren:

Delphi-Quellcode:
IMyInterface = interface
['{someGUID}']
  
  procedure MyFirstProcedure; // <-- Eventuell hier ein virtual falls der Compiler meckert und hier ein virtual erlaubt ist
end;

TMyClass = class(TInterfacedObject, IMyInterface)
  private
    procedure MyFirstProcedure; virtual;
end;

TMyFirstDerivedClass = class(TMyClass)
  private
    procedure MyFirstProcedure; override;
end;

TMySecondDerivedClass = class(TMyClass)
  private
    procedure MyFirstProcedure; override;
end;
Wenn nicht, dann könntest du es auch so lösen. Kommt eben darauf an, ob ein Teil der Interface Methoden gleich ist und ein weiterer Teil sich unterscheidet:

Delphi-Quellcode:
IMyInterface = interface
['{someGUID}']
  
  procedure MyFirstProcedure;
end;

TMyClass = class(TInterfacedObject)
  private
    procedure MyFirstProcedure; virtual;
end;

TMyFirstDerivedClass = class(TMyClass, IMyInterface)
  private
    procedure MyFirstProcedure; override;
end;

TMySecondDerivedClass = class(TMyClass, IMyInterface)
  private
    procedure MyFirstProcedure; override;
end;
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Vererbung bei Implementierung eines Interfaces

  Alt 15. Jul 2018, 07:02
Man kann virtuelle Methoden für ein Interface benutzen und diese auch überschreiben.

Nur im Interface selber kann man virtual usw. natürlich nicht nutzen, da das Interface ja nur die vorhandene Implementierung nutzt, egal wie diese deklariert ist.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Vererbung bei Implementierung eines Interfaces

  Alt 15. Jul 2018, 09:48
bin mir gar nicht sicher ob ich override & virtual überhaupt benötige - das verschieben von gemeinsamen Funktionen in eine Root Klasse scheint zu funktionieren


Delphi-Quellcode:
IMyInterface = interface
['{someGUID}']
  procedure MySharedProcedure;
  procedure MyFirstProcedure;
end;

TMyClass = class(TInterfacedObject)
  private
    procedure MySharedProcedure;
end;

TMyFirstDerivedClass = class(TMyClass, IMyInterface)
  private
    procedure MyFirstProcedure;
end;

TMySecondDerivedClass = class(TMyClass, IMyInterface)
  private
    procedure MyFirstProcedure;
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Vererbung bei Implementierung eines Interfaces

  Alt 15. Jul 2018, 10:46
Die Implementation der letzten Ableitung, in welcher das Interface angegeben wurde, wird genommen.

Interface nur beim Vorfahren mit Virtual+Override (die Methoden überschreiben)
oder Interface mehrmals eingebunden geht nur auch ohne. (hier ist dann quasi das Inferface überschrieben, aber durch Method-Override würde das natürlich umgangen)
$2B or not $2B

Geändert von himitsu (15. Jul 2018 um 13:30 Uhr)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Vererbung bei Implementierung eines Interfaces

  Alt 15. Jul 2018, 14:28
Eine andere Methode wäre ein gemeinsames Basis-Interface. Und in den abgeleiteten Klassen jeweils ein weiteres Interface mit den speziellen Methoden für diese Klasse. Dann kann mit Supports() geprüft werden um welches Interface es sich handelt.
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#7

AW: Vererbung bei Implementierung eines Interfaces

  Alt 15. Jul 2018, 14:44
Als weitere Möglichkeit
Delphi-Quellcode:
IMyInterface = interface
  ['{934A8DAD-87C1-4780-8865-A9BD9CF5DFC8}']
  procedure MySharedProcedure;
  procedure MyFirstProcedure;
end;

TShared = class
public
  procedure MySharedProcedure;
end;

TMyFirstImpl = class(TInterfacedObject, IMyInterface)
private
  FShared: TShared;
protected
  property Shared: TShared read FShared implements IMyInterface;
  procedure MyFirstProcedure;
public
  constructor Create;
  destructor Destroy; override;
end;

{ TShared }

procedure TShared.MySharedProcedure;
begin
  // add some code
end;

{ TMyFirstImpl }

constructor TMyFirstImpl.Create;
begin
  inherited;
  FShared := TShared.Create;
end;

destructor TMyFirstImpl.Destroy;
begin
  FShared.Free;
  inherited;
end;

procedure TMyFirstImpl.MyFirstProcedure;
begin
  // add some code
end;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#8

AW: Vererbung bei Implementierung eines Interfaces

  Alt 15. Jul 2018, 15:26
Folgendes könnte unter bestimmten Umständen auch gehen und erzwingt nicht die Implementierung in der Basisklasse. Damit lässt es sich auch in bestehende Vererbungshierarchien einbinden. Klappt aber nur, wenn die Methoden weitestgehend autark sind.
Delphi-Quellcode:
// implementiert
TMyClassRoot = class ();
  procedure MySharedProcedure;
end;

IMyLibrary = interface
  procedure MySharedProcedure;
  procedure MyFirstProcedure;
end;


TMyClassA = class ( TInterfacedObject, IMyLibrary);
private
  FMyRoot: TMyClassRoot; // im Create erstellen und Destroy freigeben
protected
  MyRoot: TMyClassRoot read FMyRoot implements IMyLibrary; // was in TMyClassRoot fehlt, liefert diese Klasse nach
  procedure MyFirstProcedure;
end;


TMyClassB = class ( TInterfacedObject, IMyLibrary);
private
  FMyRoot: TMyClassRoot; // im Create erstellen und Destroy freigeben
protected
  MyRoot: TMyClassRoot read FMyRoot implements IMyLibrary; // was in TMyClassRoot fehlt, liefert diese Klasse nach
  procedure MyFirstProcedure;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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 22:39 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