AGB  ·  Datenschutz  ·  Impressum  







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

Mehrfachvererbung: Interfaces, Objekte

Ein Thema von quendolineDD · begonnen am 11. Mär 2009 · letzter Beitrag vom 11. Mär 2009
Antwort Antwort
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#1

Mehrfachvererbung: Interfaces, Objekte

  Alt 11. Mär 2009, 12:09
Hallo DP

Ich bin noch in der Überlegungsphase, mir ein Pluginsystem zu schreiben, in dem ich über Plugin-DLLs so gut wie alles freigeben will.
Um das erstmal zu testen, wollte ich mir eine Beispielanwendung schreiben, was dies mit einem MainMenu realisiert.
Nun habe ich aber die Frage, wie ich diese Sachen zusammen bekomme:
Delphi-Quellcode:
IMainMenu = Interface(IInterface)
['{A01384F7-E3EA-49E5-B030-AED042FFBAB9}']

end;
TIMainMenu = class(TInterfacedObject, TMainMenu, IMainMenu)

end;
TInterfacedObject würde ich gerne einbringen, da dort die automatische Referenzzählung vorgenommen wird.
Da Mehrfachvererbung in Delphi nicht möglich ist, funktioniert das natürlich nicht.
Mein Ziel ist dabei, den DLLs zur Manipulation des MainMenus lediglich ein Interface zu übergeben, was benötigte Methoden bereitstellt.

Mir vorgeschlagen wurde auch eine andere Möglichkeit:
Delphi-Quellcode:
TIMainMenuWrapper = class(TInterfacedObject, IMainMenu)

end;

TIMainMenu = class(TMainMenu)
private
   FInterface : TIMainMenuWrapper;
public
   constructor Create(AOwner : TComponent; AInterface : TIMainMenuWrapper = nil); reintroduce; virtual;
end;
Jedoch kann ich mit der 2. Variante nichts anfangen.
Wie kann ich nun ersteres realisieren?
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#2

Re: Mehrfachvererbung: Interfaces, Objekte

  Alt 11. Mär 2009, 12:15
Gar nicht.

Das einzige was Du machen kannst ist z.B. direkt vin TInterfacedObject abzuleiten, ein TMainMenu als privaten Member zu implementieren und alle Aufrufe an IMainMenu an die TMainMenu instanz innerhalb Deines Objektes weiterzuleiten.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Mehrfachvererbung: Interfaces, Objekte

  Alt 11. Mär 2009, 12:54
Zitat von quendolineDD:

Mir vorgeschlagen wurde auch eine andere Möglichkeit:
Delphi-Quellcode:
TIMainMenuWrapper = class(TInterfacedObject, IMainMenu)

end;

TIMainMenu = class(TMainMenu)
private
   FInterface : TIMainMenuWrapper;
public
   constructor Create(AOwner : TComponent; AInterface : TIMainMenuWrapper = nil); reintroduce; virtual;
end;
Jedoch kann ich mit der 2. Variante nichts anfangen.
Wie kann ich nun ersteres realisieren?
Schau mal in Classes.pas (Delphi 7):

TComponent = class(TPersistent, IInterface, IInterfaceComponentReference) Sieht so aus, als ob man jede Komponente auch als Interface ansprechen kann. Die Referenzzählung in TComponent ist aber mit einigen if's gestaltet, die ich mir noch nicht näher angeschaut habe.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Mehrfachvererbung: Interfaces, Objekte

  Alt 11. Mär 2009, 13:10
Zitat von mjustin:
Sieht so aus, als ob man jede Komponente auch als Interface ansprechen kann. Die Referenzzählung in TComponent ist aber mit einigen if's gestaltet, die ich mir noch nicht näher angeschaut habe.
Und die bringen nix.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Mehrfachvererbung: Interfaces, Objekte

  Alt 11. Mär 2009, 13:13
Zitat von mjustin:
Sieht so aus, als ob man jede Komponente auch als Interface ansprechen kann. Die Referenzzählung in TComponent ist aber mit einigen if's gestaltet, die ich mir noch nicht näher angeschaut habe.
die meißten IFs gehen wohl darauf hinaus, daß {TComponent}.VCLComObject etwas vom Typ IVCLComObject zugewiesen sein muß,
über welches dann alles bezüglich des Interfaces läuft.

[add]
Im Notfall die in TInterfacedObject eingeführten Dinge kopieren und direkt einbauen, oder halt 'ne eigene Version.

Aber ich denke es würde übr ein zusätzliches InterfaceObjekt wohl am Besten sein, welches dann die Komponente anspricht.


Wenn dein Programm aber das TMainMenu erstellt, verwaltet und freigibt
und die anderen da nichts ändern, dann könntest du auch eventuell die Referenzzählung weglassen?
$2B or not $2B
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Mehrfachvererbung: Interfaces, Objekte

  Alt 11. Mär 2009, 16:59
Zitat von himitsu:
Wenn dein Programm aber das TMainMenu erstellt, verwaltet und freigibt
und die anderen da nichts ändern, dann könntest du auch eventuell die Referenzzählung weglassen?
Ja, eigentlich schon. WO ich überall die Schnittstellen schaffen werde ist mir auch noch nicht ganz klar.
Aber an der Stelle ist das eine Überlegung, an die ich gar nicht dachte. Und auch wohl das Beste.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  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 17:14 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