2014-03-05 3 views
6

Mit anderen Worten, warum können sie nicht wie ein normales Objekt manuell verwaltet werden? Oder haben sich die Delphi-Entwickler gerade für die Referenzzählung entschieden, da sie ohnehin für COM benötigt wurde?Warum müssen Delphi-Objekte, die Schnittstellen implementieren, als Referenz gezählt werden?

+2

Schnittstellen nichts tun. Es liegt an den Klassen, die Schnittstellen implementieren, wie sie die Referenzzählung verwalten. Jedenfalls haben neuere LLVM-basierte Delphi-Compiler die Referenzzählung für Objektreferenzen eingeführt. –

+1

@ GünthertheBeautiful Das stimmt. Alle Delphi-Interfaces werden jedoch von 'IInterface' abgeleitet, und das Zuweisen von Referenzen führt dazu, dass der Compiler Aufrufe von' _AddRef' und '_Release' generiert. Das implementierende Objekt kann nichts tun, aber die Aufrufe sind immer noch da. Das ist etwas, das nicht getan werden muss, und ist nicht in Sprachen wie C und C++ gebacken. –

+1

Tatsache ist, dass nicht die Objekte Referenz gezählt werden, die Schnittstellen sind. Die Objekte müssen natürlich auch diesen Teil implementieren, aber die Aufrufe von AddRef und Release befinden sich normalerweise auf den Schnittstellen, nicht auf den Objekten. –

Antwort

11

Als Erstes müssen die Schnittstellen zu Delphi hinzugefügt werden, um COM zu unterstützen. Viele der Designentscheidungen wurden daher von dem Wunsch geleitet, die COM-Programmierung zu vereinfachen.

Schnittstellenreferenzen können perfekt manuell verwaltet werden. In der Tat umfasste das rohe COM in C und C++ ursprünglich die manuelle Referenzzählungsverwaltung mit expliziten Aufrufen an AddRef und Release. Wenn Sie COM-Objekte von C aus konsumieren, müssen Sie weiterhin eine manuelle Referenzzählungsverwaltung durchführen. Für C++ verwenden Sie in diesen Tagen normalerweise eine Klasse wie CComPtr, um die automatische Referenzzählungsverwaltung zu aktivieren.

Als COM-Unterstützung zu Delphi hinzugefügt wurde, war der Hauptkonkurrent zu Delphi VB. Und in VB mussten Sie noch nie manuelle Referenzzählungsverwaltung durchführen. Wären die Delphi-Designer nicht in der Lage, die automatische Referenzzählung zu implementieren, wäre es viel schwieriger gewesen, VB-Programmierer anzuweisen, VB zu verlassen und Delphi zu verwenden. Daher spekuliere ich, dass dies ein Treiber bei den Entscheidungen der Delphi-Designer war. Selbst wenn dies nicht der Fall ist, ist es viel einfacher, die automatische Referenzzählung zu programmieren, als sie manuell zu programmieren. Auch wenn meine Spekulationen falsch sind, macht die Entscheidung der Delphi-Designer das Leben viel einfacher.

So auf Ihre speziellen Fragen kommen:

Warum sie wie ein normales Objekt kann nicht manuell verwaltet?

Sie können sein. Sie können _AddRef und _Release implementieren, so dass sie die Lebensdauer des Objekts nicht steuern. Insbesondere ist es nicht obligatorisch, dass diese Methoden Referenzen zählen, und auch nicht _Release, um Free zu rufen.

Haben sich die Delphi-Entwickler nur für die Referenzzählung entschieden, da sie für COM benötigt wurde?

Nun, es ist nicht für COM erforderlich. Wie ich oben sagte, können Sie gegen COM in C oder C++ (oder in anderen Sprachen) ohne automatische Referenzzählung programmieren.


Eine andere Frage, die Sie gefragt haben könnte, weshalb Delphi-Schnittstellen von IInterface abzuleiten haben. Dies ergibt sich aus ihrem ursprünglichen Zweck, COM-Schnittstellen zu implementieren. In vielerlei Hinsicht wäre es schön, wenn wir Schnittstellen haben könnten, die nicht von IInterface abgeleitet sind. Aber es ist was es ist.

+4

Beachten Sie, dass ein Delphi-Objekt, das von 'TComponent' abgeleitet ist, die Referenzzählung deaktiviert hat, event, wenn es Interfaces implementiert. Und die Einführung eines neuen, nicht-refcounteten Schnittstellentyps für den Compiler wurde schon oft angefordert und Embarcadero ist sich dessen bewusst. Ob es jemals umgesetzt werden wird, ist eine Vermutung. –

Verwandte Themen