2017-05-28 10 views
5

this प्रश्न में आप देखेंगे कि abstract keywrod जोड़ने वाला एक सार वर्ग बनाना संभव है। मैं डेल्फी में एक परियोजना का अनुवाद कर रहा हूं लेकिन मुझे लगता है कि यह एक अमूर्त वर्ग के निर्माण की अनुमति देता है। यह कोड है:डेल्फी अमूर्त वर्ग कार्यान्वयन से बचें

type 
TCableSPF = class abstract 
    //code 
end; 

यह पाठ्यक्रम का एक सार वर्ग है और मेरे पास बहुत सारे उप-वर्ग हैं जो इसे लागू करते हैं। जिस तरह से मैं देखता हूं कि इस तरह का एक उदाहरण बनाना संभव है;

a := TCableSPF.Create; 

जब मैं अपने तरीकों कि आभासी हैं और अमूर्त मैं त्रुटि मिलती है और यह ठीक है, लेकिन मैं वर्ग के निर्माण को रोका जा सकता कॉल करने के लिए कोशिश? या डेल्फी डिफ़ॉल्ट रूप से इसकी अनुमति देता है? मदद

+1

यह एक ज्ञात मुद्दा है: https://quality.embarcadero.com/browse/RSP-10235 –

+0

कुछ गूगलिंग के बाद, मुझे एक विकल्प '{$ WARN CONSTRUCTING_ABSTRACT ERROR} 'मिला, हालांकि, मैंने एक नज़र डाली [ RADStudio के टोक्यो दस्तावेज़] (http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Classes_and_Objects) (@SebastianProske द्वारा दिखाए गए लिंक में संदर्भित), और दुर्भाग्य से निम्नलिखित नोट मिला: "_Delphi एक वर्ग घोषित अमूर्त को तत्काल करने की अनुमति देता है, पिछड़े संगतता के लिए, लेकिन इस सुविधा का अब और उपयोग नहीं किया जाना चाहिए "। : -/ – silvioprog

उत्तर

7

class abstractDelphi for .Net दिनों से होल्डओवर है।
अज्ञात कारणों से अज्ञात इस कीवर्ड के पीछे कोई (वर्तमान) कार्यान्वयन नहीं है।

यदि आप एक अमूर्त वर्ग के तत्कालता को रोकना चाहते हैं, तो यह कीवर्ड मदद नहीं करेगा। इसके बजाय निम्न कार्य करें:

type 
    TCableSPF = class abstract 
    //code 
strict protected 
    //Define all constructors for an abstract class as protected. 
    constructor Create; virtual; reintroduce; 
end; 

की रक्षा की, केवल वंशज वस्तु के रूप में सभी निर्माताओं को परिभाषित निर्माता का उपयोग कर सकते करके, अन्य कोड निर्माता उपयोग नहीं कर सकते।
क्योंकि आप आभासी निर्माता में पुनः, आप भी इसे प्रयोग का दृष्टांत नहीं कर सकते हैं:

unit A; 

type 
    TMyAbstractObject = class abstract(TObjectX) 
    strict protected 
    constructor Create; virtual; reintroduce; 
    end; 

... 
unit B; 

    TMyClass = class of TObjectX; 

    AbstractObjectInstance = TMyClass.Create; //Will not work for TMyAbstractObject 

ध्यान दें कि आप नहीं निर्माता override घोषित करना चाहिए। इसके बजाय इसे virtual reintroduce घोषित करें (या केवल reintroduce यदि आप आभासी रचनाकारों को अनुमति नहीं देना चाहते हैं)।

+0

बहुत बहुत धन्यवाद। यही वही बात है जो सी ++ करता है क्योंकि इसमें अमूर्त कीवर्ड नहीं है। बीटीडब्ल्यू, मुझे एक वर्कअराउंड का उपयोग करना है जो मैं देखता हूं। मुझे आशा है कि वे इसे ठीक करेंगे क्योंकि यह परेशान है:/ –

+0

मुझे फिर से पेश क्यों करना चाहिए और ओवरराइड क्यों नहीं करना चाहिए? क्या ऐसा इसलिए है क्योंकि सारणी में कोई कार्यान्वयन नहीं है? –

+0

.net कंपाइलर में इसके पीछे कार्यान्वयन किया गया था। –

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