![]() |
Schnittstelle ohne COM-Eigenschaft
Es mag vielleicht banal klingen, aber in bin zuletzt aus der C#-Ecke gekommen und möchte gern die dort gewonnenen Design-Goodies auch als Delphi-Neuling weiterverwenden.
Wenn ich ein Interface deklariere, und in einer Klasse unsetze, verlangt der Compiler von mir, dass ich die IUnknown-Methoden implementiere. Ich habe aber gar nicht vor, COM-Objekte zu erstellen, sondern möchte eine Schnittstelle in verschiedenen Klassen verwenden, um sie auf einheitliche Weise ansprechen zu können. Ebenso kann ich dabei die Release-Logik absolut nicht gebrauchen, lässt sich die abschalten? Gibt es eine solche Möglichkeit in Delphi nicht? |
AW: Schnittstelle ohne COM-Eigenschaft
Ich dachte, jedes Interface leitet sich erst einmal von
Delphi-Quellcode:
ab? Solange du kein COM willst, sollte
IInterface
Delphi-Quellcode:
da doch erst gar nicht ins Spiel kommen?
IUnknown
Das konkrete Objekt muss (eher: sollte), sobald es auch nur ein Interface implementiert, sich von
Delphi-Quellcode:
als Elternklasse ableiten. Oder halt einer Klasse, die
TInterfacedObject
Delphi-Quellcode:
schon irgendwo als Vorfahr hat. Denn das implementiert die Standard-Interface-Methoden wie
TInterfacedObject
Delphi-Quellcode:
bereits.
_Release
Oder habe ich was falsch verstanden? |
AW: Schnittstelle ohne COM-Eigenschaft
Leider geht das nicht so einfach und reibungslos wie bei C# :(
Interfaces unter Delphi müssen immer von
Delphi-Quellcode:
oder
IUnknown
Delphi-Quellcode:
(was das Gleiche ist) abgeleitet werden.
IInterface
Damit du die Methoden von
Delphi-Quellcode:
nicht selbst implementieren musst, kannst du von der Klasse
IUnknown
![]() Wenn man einen Interfacezeiger hat ist es auch nur mit Klimmzügen möglich wieder an das eigentliche Klassenobjekt zu kommen. Das bedeutet man kann ein Objekt, dass über ein Interface referenziert wird nicht einfach mit
Delphi-Quellcode:
freigeben weil man über das Interface gar nicht an die Free-Methode herankommt.
Free
Daraus folgt, dass man immer die Referenzzählung von IUnknown benutzen sollte (auch wenn man die Referenzzählung aushebeln kann und sie dabei aber weitere Schwierigkeiten einhandelt) |
AW: Schnittstelle ohne COM-Eigenschaft
Zitat:
Zitat:
Außerdem möchte ich gern vermeiden, dass der COM-Unterbau darunter ist. Bei C# geht das auch, warum muss Delphi unbedingt COM ins Spiel bringen. |
AW: Schnittstelle ohne COM-Eigenschaft
Zitat:
welche Möglichkeiten gibt es denn, die Interfaces wie Interfaces zu verwenden? Ich möchte gern Objekte verschiedener Klassen, die bestimmte Eigenschaften gemeinsam haben auch gemeinsam verwenden. C++ hat dafür die Mehrfachvererbung, C# die frei verwendbaren Interfaces. Das COM dabe die Objekte einfach wegschmeißt, darf dabei natürlich nicht passieren. |
AW: Schnittstelle ohne COM-Eigenschaft
Zitat:
Der frühere Chefentwickler von Turbo Pascal & Delphi Anders Hejlsberg ist zu Microsoft gewechselt und dort die C# Entwicklung massgeblich voran getrieben. C# ist im Prinzip ähnlich zu Delphi nur dass die Schwächen von Delphi in C# behoben wurden. Interfaces wurden in Delphi erst nachträglich eingebaut. Man merkt das unter anderem daran, dass die VCL Klassenbibliothek so gut wie keinen Gebrauch von Interfaces macht. Interfaces sind in Delphi mehr oder weniger ein Fremdkörper geblieben. Zitat:
In Delphi sind Interfaces eine Einbahnstrasse. Man kann einen Objektzeiger in einen Interfacezeiger umwandeln (
Delphi-Quellcode:
) aber die umgekehrte Richtung ist nicht vorgesehen.
iz := meinobjekt as IMeinInterface
|
AW: Schnittstelle ohne COM-Eigenschaft
Zitat:
Zitat:
Zitat:
iz = meinobjekt; meinobjekt = iz as meineklasse; Es geht mir nur darum, dass ich mir nicht eine Interfacereferenz hole und die mir dadurch, wenn ich sie nicht mehr brauche, das Objekt weghaut. |
AW: Schnittstelle ohne COM-Eigenschaft
Zitat:
|
AW: Schnittstelle ohne COM-Eigenschaft
Um mal in die Richtung Konstruktivität zu kommen...
Kann ich dort, wo ich meine Klassen erzeuge (und wo sie später irgendwann entfernt werden sollen) den Referenzzähler um eins erhöhen und dort, wo das Objekt definitiv nicht mehr gebraucht wird, diesen Referenzzähler herunterzählen? So wäre sichergestellt, dass das Objekt nicht ausversehen ins Nirwana verschwindet. Oder kann ich in meinen Klassen den Referenzzähler komplett ignorieren und den Free auf das Objekt weiterverwenden? Wäre mir ehrlich gesagt am liebsten. |
AW: Schnittstelle ohne COM-Eigenschaft
Zitat:
Zitat:
Du kannst die Referenzzählung aber auch nutzen. Das programmiert sich dann so ähnlich wie die Smartpointer aus C++. Hab ich noch nicht gemacht, aber es gibt manche, die das wirklich mögen. Näheres zu Interfaces liest du z.B. bei Nick Hodges. mfg Christian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:40 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 by Thomas Breitkreuz