AGB  ·  Datenschutz  ·  Impressum  







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

Interface-Vererbung einer privaten Klasse

Ein Thema von normancz · begonnen am 30. Jan 2012 · letzter Beitrag vom 30. Jan 2012
Antwort Antwort
normancz

Registriert seit: 28. Mär 2008
6 Beiträge
 
Delphi 2010 Professional
 
#1

Interface-Vererbung einer privaten Klasse

  Alt 30. Jan 2012, 14:48
Delphi-Version: 2007
Hallo,
ich habe hier eine private Klasse, welche nur per Interface erreichbar sein soll um sie später per Factory/DI einfach auszutauschen:
Delphi-Quellcode:
unit UnitA;

interface

type
  IFoo = interface(IInterface)
  ['{90CA22A8-ACC3-4EF8-8E41-3C1B7EF755E3}']
    procedure Foo; stdcall;
  end;

function GetFooFromFactoryWithDI: IFoo;

implementation

type
  TFoo = class(TInterfacedObject, IFoo)
  protected
    procedure Foo; stdcall;
  end;

...
Nun möchte ich diese Klasse in einer anderen Unit noch erweitern. Dies klappt allerdings nicht so, wie ich es mir vorstelle:
Delphi-Quellcode:
unit UnitB;

interface

uses
  UnitA;

type
  IBar = interface(IFoo)
  ['{ABCDF8A2-646E-48A7-8B80-DAAE3244281B}']
    procedure Bar; stdcall;
  end;

function GetBarFromFactoryWithDI: IBar;

implementation

type
  TBar = class(TInterfacedObject, IBar)
  private
    fMasterFoo: IFoo;
  protected
    procedure Bar; stdcall;
  public
    property MasterFoo: IFoo read fMasterFoo implements IFoo;
  end;

...
Ich dachte eigentlich, dass ich per implements das Foo-Interface einfach einbinden kann, aber Delphi will es dann auch in der Klassendefinition angegeben haben. Nur danach wird Foo aus IBar vermisst.

Was habe ich da übersehen, oder ist so eine Vererbung nicht möglich?

Edit:
Jetzt bin ich einen Schritt weiter gekommen, welcher zumindest compiliert aber noch nicht außerhalb des Beispielprojekts getestet wurde:
Delphi-Quellcode:
  TNewFoo = class(TInterfacedObject, IFoo)
  private
    fMasterFoo: IFoo;
  public
    property MasterFoo: IFoo read fMasterFoo implements IFoo;
  end;

  TBar = class(TNewFoo, IBar)
  protected
    procedure Bar; stdcall;
  end;
Gibt es eine elegantere Lösung ohne die zweit-Klasse?

Bye,
Norman

Geändert von normancz (30. Jan 2012 um 15:10 Uhr)
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

AW: Interface-Vererbung einer privaten Klasse

  Alt 30. Jan 2012, 15:10
Vererbung von Interfaces ist immer mit Vorsicht zu geniessen.
Aber man kann ja mehrere Interfaces pro Klasse implementieren:
Delphi-Quellcode:
  IFoo = interface(IInterface)
  ['{90CA22A8-ACC3-4EF8-8E41-3C1B7EF755E3}']
    procedure Foo; stdcall;
  end;

  IBar = interface(IInterface)
  ['{ABCDF8A2-646E-48A7-8B80-DAAE3244281B}']
    procedure Bar; stdcall;
  end;

type
  TFoo = class(TInterfacedObject, IFoo, IBar)
  protected
    procedure Foo; stdcall;
    procedure Bar; stdcall;
  end;


var
  x : IFoo;
  b : IBar;
begin
  x := TFoo.Create();
  x.Foo;

  b := x as IBar; // bei älterem Delphi muss hier die Supports-Funktion verwendet werden
  b.Bar;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Interface-Vererbung einer privaten Klasse

  Alt 30. Jan 2012, 15:39
Du willst ja ein Objekt haben, welches mehrere Interfaces implementiert.
Ein Interface ist nur die Schnittstelle. IFoo kennt also keinerlei funktionalen Code und erst Recht nicht den von TFoo, da es TFoo garnicht kennt.

TBar ist ein eigenes Objekt und das kennt TFoo nicht, also kann es auch nicht die Methoden von IBar automatisch bereitstellen.

Entweder du leitest TBar von TFoo ab.
Oder du mußt IFoo innerhalb des TBar laden/erstellen, die Methoden von IFoo auch noch in dein TBar implementieren und die Aufrufe zum eingebundenen IFoo weiterleiten.

Oder du implementierst alles in TBar nochmals neu, welches von dem unzugänglichen TFoo benötigt wird.
$2B or not $2B
  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 00:20 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