2016-05-18 14 views
5

मैं निम्नलिखित कोड है। मैं सूची के संशोधन पर एक घटना बनाने में सक्षम होने के लिए आधार आधार सूची की अधिसूचना विधि को ओवरराइड करना चाहता हूं।सामान्य वर्चुअल विधि का वारिस कैसे करें?

TDescendantList = class(TObjectList<TSomeclass>) 
    private 
    <...> 
    protected 
    procedure Notify(const Value: T; 
     Action: TCollectionNotification); override; 
    <...> 
    end; 

अगर मैं Value: T डाल मैं एक "अघोषित पहचानकर्ता" टी पर मिल

तो Value: TSomeClass है मैं " 'सूचित किया जाए' की घोषणा पिछले घोषणा से अलग है" मिल

NotifyTObjectList<T: class> की एक संरक्षित तरीका है। यह विधि XE2 IDE की ओवरराइडिंग सूची पर प्रकट नहीं होती है।

इस लागू करने के लिए कोई रास्ता नहीं है या मैं के रूप में यह एक लौकिक ईंट की दीवार है एक और दृष्टिकोण का उपयोग करने की जरूरत है कि?

उत्तर

11

अपने वंशज वर्ग सामान्य प्रकार फिक्सिंग रही है तो आप अपने मामले में टी के स्थान पर कि निश्चित प्रकार का उपयोग करने के लिए है:

protected 
    procedure Notify(const Value: TSomeclass; 
        Action: TCollectionNotification); override; 

इस समारोह की घोषणा करने के सही तरीका है।


त्रुटि:

'सूचित किया जाए' की घोषणा अलग

पिछले घोषणा से विभिन्न इकाइयों में डेल्फी RTL नकल प्रकार नामों की एक अफसोस की बात मामला है।

इकाई System.Classes को परिभाषित करता है

TCollectionNotification = (cnAdded, cnExtracting, cnDeleting); 

और System.Generics.Collections को परिभाषित करता है

TCollectionNotification = (cnAdded, cnRemoved, cnExtracted); 

लगभग पूर्ण रूप से आपClasses अपने uses खंड और संकलक TCollectionNotification की अवांछित संस्करण को हल करने में Generics.Collections घोषित से पहले की है।

इसे ठीक करने के लिए, या तो अपने uses खंड पुनर्निर्माण Generics.Collections आता है ताकि बाद Classesया पूरी तरह से योग्य प्रकार का नाम, यानी उपयोग करें:

procedure Notify(const Value: TSomeClass; 
    Action: Generics.Collections.TCollectionNotification); override; 

एक differs from previous declaration त्रुटि के साथ सबक विधिपूर्वक करने के लिए है अपने प्रकार की जांच करें। Ctrl +प्रकार पहचानकर्ता पर क्लिक करें प्रकार संकलक उपयोग कर रहा है की परिभाषा के लिए ले जाएगा।

+1

बिल्कुल सही! मैंने दोनों चीजें बनाई: 'उपयोग' खंड ** और ** को पुनर्गठित किया गया पूरी तरह से योग्य नाम डाला। +1 और स्वीकार किया गया –

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