Generics.Collections
में कक्षाएं IInterface
लागू नहीं करती हैं। आपको इसे अपने व्युत्पन्न कक्षाओं में पेश करना होगा और मानक कार्यान्वयन प्रदान करना होगा। या एक अलग, तीसरी पार्टी, कंटेनर कक्षाओं के साथ काम करने के लिए सेट करें।
उदाहरण के लिए:
TMyList = class(TInterfacedList<IMyItem>, IMyList)
याद रखें कि आप संदर्भ गिना जीवन प्रबंधन का उपयोग करता है किसी भी अन्य की तरह इस वर्ग के इलाज के लिए की जरूरत है:
TInterfacedList<T> = class(TList<T>, IInterface)
protected
FRefCount: Integer;
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
end;
function TInterfacedList<T>.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result := 0
else
Result := E_NOINTERFACE;
end;
function TInterfacedList<T>._AddRef: Integer;
begin
Result := InterlockedIncrement(FRefCount);
end;
function TInterfacedList<T>._Release: Integer;
begin
Result := InterlockedDecrement(FRefCount);
if Result = 0 then
Destroy;
end;
तब आप अपने विशेष वर्ग घोषणा कर सकते हैं। केवल इंटरफेस के माध्यम से इसका संदर्भ लें।
TInterfacedList<T>
से पहले आप वास्तव में कुछ और काम करना चाहते थे। आपको IList<T>
घोषित करने की आवश्यकता होगी जो सूची क्षमताओं का पर्दाफाश करेगी।
IList<T> = interface
function Add(const Value: T): Integer;
procedure Insert(Index: Integer; const Value: T);
.... etc. etc.
end;
आप तो बस TInterfacedList<T>
द्वारा समर्थित इंटरफेस की सूची और आधार वर्ग TList<T>
करने के लिए IList<T>
जोड़ सकते हैं इंटरफ़ेस अनुबंध को पूरा होगा: यह कुछ इस तरह होगा।
TInterfacedList<T> = class(TList<T>, IInterface, IList<T>)
स्रोत
2012-03-26 18:13:20
यह TInterfaceObject के तरीकों की नकल करने के लिए सुरक्षित है? –
ठीक है। मैं इसे याद रखने की कोशिश करूंगा! –
मैंने जवाब थोड़ा सा जवाब दिया है। 'TList' के आधार पर एक सुंदर सक्षम 'IList ' प्राप्त करने के लिए यह बहुत अधिक काम नहीं है। –