2010-02-09 9 views
5

डेल्फी 2010 में, मैं एक सामान्य TInterfaceList इस प्रकार परिभाषित किया है:क्या डेल्फी जेनेरिक टीइंटरफेसलिस्ट संभव है?

type 

TInterfaceList<I: IInterface> = class(TInterfaceList) 
    function GetI(index: Integer): I; 
    procedure PutI(index: Integer; const Item: I); 
    property Items[index: Integer]: I read GetI write PutI; default; 
end; 

implementation 

function TInterfaceList<I>.GetI(index: Integer): I; 
begin 
    result := I(inherited Get(Index)); 
end; 

procedure TInterfaceList<I>.PutI(index: Integer; const Item: I); 
begin 
    inherited Add(Item); 
end; 

मैं किसी भी समस्याओं अभी तक नहीं किया है था, लेकिन वहाँ कुछ भी स्वाभाविक ऐसा करने के बारे में जोखिम भरा है? क्या ..in loops पर काम करने की अनुमति देने के लिए इसमें एक गणनाकर्ता जोड़ना संभव होगा? यदि इसमें कुछ भी गलत नहीं है, तो मुझे आश्चर्य है कि कुछ ऐसा क्यों आरटीएल में पहले से परिभाषित नहीं किया गया है।

उत्तर

11

आधार श्रेणी के रूप में TInterfaceList का उपयोग न करें।

यदि आप एकल-थ्रेडेड काम करते हैं तो आप इसके बजाय TList<I: IInterface> का उपयोग कर सकते हैं। प्रदर्शन बेहतर होगा, क्योंकि कोई आंतरिक लॉकिंग नहीं है।

यदि आप बहु-थ्रेडेड काम करते हैं तो TInterfaceList का सार्वजनिक इंटरफ़ेस अनुपयुक्त है, जैसा कि वे वीसीएल में लागू किए गए हैं। चीजों के संग्रह पर सुरक्षित रूप से पुन: सक्रिय करने के लिए एक बेहतर एपीआई की चर्चा के लिए this blog post देखें।

यदि आप धागे के बीच इंटरफेस की अपनी सूची साझा करते हैं तो आपको इसे जितना संभव हो सके लॉक करना चाहिए। ऐसा करने का एक अच्छा तरीका एक थ्रेड-सुरक्षित विधि को कार्यान्वित करना है जो कॉलिंग थ्रेड पर इंटरफेस की एक सरणी देता है, जिसे मूल सूची को लॉक किए बिना सुरक्षित रूप से फिर से चालू किया जा सकता है।

संबंधित मुद्दे