2012-02-01 3 views
17

काल्पनिक वस्तु पदानुक्रम पर विचार करें, के साथ शुरू:डेल्फी: पद्धति 'बनाएं' खाल आधार की आभासी विधि - लेकिन यह सही नहीं है

TFruit = class(TObject) 
public 
    constructor Create(Color: TColor); virtual; 
end; 

और उसके वंशज:

TApple = class(TFruit) 
public 
    constructor Create(); overload; virtual; 
    constructor Create(Color: TColor); overload; override; //deprecated. Calls other constructor - maintaining the virtual constructor chain 
end; 

विचार यहाँ है मैं अधिरोहित है कि आभासी आधार वर्ग के निर्माता, एक अधिभार कि भी आभासी होने के साथ।

डेल्फी शिकायत:

विधि 'बनाएं' खाल आधार प्रकार की आभासी विधि 'TFruit'

छोड़कर यह इसे छिपाने नहीं करता है - यह सही नहीं है!

  • मैं overrode पूर्वज में आभासी विधि, और
  • मैं एक और संस्करण

सौदा क्या है के साथ अतिभारित यह?

+1

मुझे "विधि 'बनाएं' आधार प्रकार 'TFruit' की आभासी विधि छुपाएं; क्या आपको वाकई "बेस टाइप 'टीएपल' 'मिल रहा है? – hvd

+0

@ आरबीए बिल्कुल नहीं, इस मामले में चेतावनी गलत है, हालांकि आप इसे रोकने के लिए 'reintroduce;' का उपयोग कर सकते हैं। – hvd

+0

यह डेल्फी 5 के लिए विशिष्ट है? – EMBarbosa

उत्तर

24

दो समाधान:

type 
    TFruit = class(TObject) 
    public 
    constructor Create(Color: TColor); virtual; 
    end; 

    TApple = class(TFruit) 
    public 
    constructor Create(); reintroduce; overload; 
    constructor Create(Color: TColor); overload; override; 
    end; 

या:

type 
    TFruit = class(TObject) 
    public 
    constructor Create; overload; virtual; abstract; 
    constructor Create(Color: TColor); overload; virtual; 
    end; 

    TApple = class(TFruit) 
    public 
    constructor Create(); override; 
    constructor Create(Color: TColor); override; 
    end; 
+3

+1। मुझे 'अधिभार', 'आभासी', और/या 'ओवरराइड' का संयोजन नहीं मिला जो XE2 के कंपाइलर को खुश कर दिया। :) –

+2

IMHO, अगर आपको पुन: उत्पन्न करने की आवश्यकता है, तो आपका कोड भयानक गंध करता है। –

+0

@WarrenP वह गंध 'reintroduce' के अन्य उपयोगों से आती है जो अक्सर विरासत तोड़ती है। – NGLN

5

यह एक "जो पहले आया था" मुद्दा की तरह प्रतीत होता है। (ऐसा लगता है कि एनजीएलएन को एक समाधान मिला।)

एक और समाधान भी है। आप एक डिफ़ॉल्ट पैरामीटर का उपयोग कर सकते हैं:

interface 

type 
    TFruit=class(TObject) 
    public 
    constructor Create(Color: TColor); virtual; 
    end; 

    TApple=class(TFruit) 
    public 
    constructor Create(Color: TColor = clRed); override; 
    end; 

implementation 

{ TFruit } 

constructor TFruit.Create(Color: TColor); 
begin 
    inherited Create; 
end; 

{ TApple } 

constructor TApple.Create(Color: TColor); 
begin 
    inherited; 
end; 

// Test code 
var 
    AppleOne, AppleTwo: TApple; 
begin 
    AppleOne := TApple.Create; 
    AppleTwo := TApple.Create(clGreen); 
end; 
+1

+1 रचनात्मकता के लिए। लेकिन पुन: पेश करने की आवश्यकता नहीं है, और मैं 'clDefault' का उपयोग करूंगा। ;) – NGLN

+0

धन्यवाद। :) आप सही हे। मुझे लगता है कि यह पहले के परीक्षणों में से एक का अवशेष है, और संकलक शिकायत नहीं करता था, इसलिए मैंने इसे पकड़ नहीं लिया। और मैंने कभी 'क्लडीफॉल्ट' रंगीन सेब नहीं देखा है। ;) –

+0

मैंने एप्पल को रंगने के लिए इसका जिक्र नहीं किया, लेकिन टीएपल में जोड़े गए पैरामीटर रहित कन्स्ट्रक्टर के प्रश्न के उद्देश्य से चिपकने के लिए। स्पष्ट रूप से ओपी सोचता है कि बिना किसी रंग के सेब हैं। ;) इसके अलावा, क्या रंग cldefault वैसे भी है? यह एक सेब का डिफ़ॉल्ट रंग है, है ना? (ठीक है, इसे काला के रूप में कार्यान्वित किया गया है, लेकिन ऐसा इसलिए है क्योंकि टीसीओएलर को केवल कुछ पूर्णांक मान की आवश्यकता है)। – NGLN

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