के रूप में कोई TInterfacedObject के साथ इंटरफ़ेस प्रकार पर ऑब्जेक्ट कास्टिंग करना मुझे कोई संदर्भ गिनती के साथ एक क्लास कार्यान्वयन इंटरफ़ेस की आवश्यकता नहीं है। मैंने निम्नलिखित किया:बेस क्लास
IMyInterface = interface(IInterface)
['{B84904DF-9E8A-46E0-98E4-498BF03C2819}']
procedure InterfaceMethod;
end;
TMyClass = class(TObject, IMyInterface)
protected
function _AddRef: Integer;stdcall;
function _Release: Integer;stdcall;
function QueryInterface(const IID: TGUID; out Obj): HResult;stdcall;
public
procedure InterfaceMethod;
end;
procedure TMyClass.InterfaceMethod;
begin
ShowMessage('The Method');
end;
function TMyClass.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result := 0
else
Result := E_NOINTERFACE;
end;
function TMyClass._AddRef: Integer;
begin
Result := -1;
end;
function TMyClass._Release: Integer;
begin
Result := -1;
end;
संदर्भ गणना की कमी ठीक काम करती है। लेकिन मेरी चिंता यह है कि मैं as
ऑपरेटर का उपयोग IMyInterface
को TMyClass
डाली नहीं कर सकता है:
var
MyI: IMyInterface;
begin
MyI := TMyClass.Create as IMyInterface;
मैं
[डीसीसी त्रुटि] E2015 ऑपरेटर लागू नहीं दिया हूँ इस संकार्य प्रकार के
समस्या तब गायब हो जाती है जब TMyClass
TInterfacedObject
से निकला - यानी मैं कंपाइलर त्रुटि के बिना ऐसा कास्टिंग कर सकता हूं। जाहिर है, मैं बेस श्रेणी के रूप में TInterfacedObject का उपयोग नहीं करना चाहता क्योंकि यह मेरी कक्षा संदर्भ गिना जाएगा। इस तरह के कास्टिंग को अस्वीकार क्यों किया जाता है और यह कैसे काम करेगा?
आपके इंटरफ़ेस घोषणा में GUID जोड़कर आपके पास बेहतर परिणाम हो सकते हैं। '= इंटरफेस 'लाइन के बाद एक नई लाइन जोड़ें और Ctrl-Shft-G दबाएं। 'as',' GetInterface' और 'support' आदि को काम करने के लिए GUID द्वारा इंटरफ़ेस की पहचान करने में सक्षम होना आवश्यक है। –
आपने मेरी पोस्ट को ध्यान से नहीं पढ़ा। जब मैं TInterfacedObject से प्राप्त करता हूं तो यह काम करता है। GUID के पास यहां कुछ भी नहीं है। COM के साथ काम करने के लिए आपको केवल GUID की आवश्यकता है। –
हम्म, जो डेल्फी संस्करण है? –