2012-12-05 7 views
6

मैं के रूप में उदाहरण के कूट नीचे एक महत्वपूर्ण सार प्रक्रिया है जिससे मैं कई बच्चे कक्षाओं में अधिक भार हूँ के साथ एक माता पिता के वर्ग है: अब वहाँ मैं जरूरतमैं अभिभावक वर्ग में पेश किए गए वर्चुअल फ़ंक्शन को कैसे अधिभारित करूं?

TCParent = Class 
private 
public 
procedure SaveConfig; virtual; abstract; 

end; 

TCChild = Class(TCParent) 
private 
public 
procedure SaveConfig; override; 
end; 

(अधिभार) एक और SaveConfig प्रक्रिया है कि होगा के साथ इस प्रक्रिया को पैरामीटर स्वीकार करें, फिर भी मैं अभिभावक वर्ग में बड़े बदलाव नहीं करना चाहता हूं जिसके लिए मुझे आवश्यकता हो सकती है और मैं अन्य सभी बच्चों के वर्गों में बदलाव कर सकता हूं।

क्या कोई तरीका है कि मैं इस विशिष्ट बाल वर्ग में SaveConfig को अधिभारित कर सकता हूं, बिना पैरेंट क्लास और अन्य बच्चे वर्गों में बड़े बदलाव किए बिना?

+3

यह नया 'SaveConfig' का नाम समान नाम क्यों है? इसे कुछ और क्यों नहीं बुलाओ? – awmross

+1

@awmross क्योंकि जब मैं 'TStream.Seek' में एक अधिभार जोड़ना चाहता हूं जो 'Int64' ऑफ़सेट लेता है। उदाहरण के साथ सवाल भ्रमित मत करो। –

उत्तर

9

आप एक नई ओवरलोडेड विधि जोड़ने के लिए reintroduce का उपयोग कर सकते हैं। ध्यान दें कि बाल वर्ग में reintroduce; overload; का आदेश आवश्यक है; यदि आप उन्हें उलट देते हैं, तो कोड संकलित नहीं होगा।

TCParent = Class 
private 
public 
procedure SaveConfig; virtual; abstract; 
end; 

TCChild = Class(TCParent) 
private 
public 
procedure SaveConfig; overload; override; 
procedure SaveConfig(const FileName: string); reintroduce; overload; 
end; 

(डेल्फी 7 में परीक्षण किया गया, तो यह और बाद में सभी संस्करणों में काम करना चाहिए।)

+0

दुर्भाग्य से मैं डेल्फी 7 :(उपयोग कर रहा हूँ तो जब मैं ऊपर कोड मैं त्रुटि मिली संकलन करने की कोशिश की: पिछले घोषणा लाइन की ओर इशारा करते से 'SaveConfig' अलग है की घोषणा: [त्रुटि] uClassChild.pas (13) प्रक्रिया SaveConfig (const फ़ाइल नाम: स्ट्रिंग); reintroduce; ओवरराइड; – MChan

+0

आप भाग्य से बाहर हैं, फिर AFAIK, D7 में एक ही चीज़ करने का कोई तरीका नहीं है (यही कारण है कि उन्होंने नया निर्देश 'reintroduce' ) –

+1

लेकिन पुनर्नवीनीकरण डेल्फी 7 में मौजूद है, यह उपरोक्त प्रो परिभाषा के साथ संकलित नहीं है ... अधिक विशिष्ट होने के लिए, डी 7 इस विशिष्ट परिभाषा में पुन: उत्पन्न करने को स्वीकार नहीं कर रहा है, लेकिन यह सामान्य रूप से अन्य परिभाषा – MChan

4

जब से तुम अन्य वंश में परिवर्तन करने के लिए नहीं करना चाहते, मैं माता-पिता के लिए एक वैकल्पिक फ़ील्ड जोड़ने का सुझाव पैरामीटर को पकड़ने के लिए कक्षा, फिर किसी भी वंशज जो पैरामीटर का उपयोग करना चाहता है, उनका उपयोग कर सकते हैं। इस तरह, आपको ओवरराइड SaveConfig() के हस्ताक्षर को बदलने की ज़रूरत नहीं है। उदाहरण के लिए:

type 
    TCParent = class 
    protected 
    SaveConfigParams: TStrings; // or whatever... 
    public 
    procedure SaveConfig; overload; virtual; abstract; 
    procedure SaveConfig(Params: TStrings); overload; 
    end; 

procedure TCParent.SaveConfig(Params: TStrings); 
begin 
    SaveConfigParams := Params; 
    try 
    SaveConfig; 
    finally 
    SaveConfigParams := nil; 
    end; 
end; 

type 
    TCChild = class(TCParent) 
    public 
    procedure SaveConfig; override; 
    end; 

procedure TCChild.SaveConfig; 
begin 
    if SaveConfigParams <> nil then 
    begin 
    // do something that uses the parameters... 
    end else begin 
    // do something else... 
    end; 
end; 

type 
    TCChild2 = class(TCParent) 
    public 
    procedure SaveConfig; override; 
    end; 

procedure TCChild2.SaveConfig; 
begin 
    // do something, ignoring the SaveConfigParams... 
end; 
+0

आपकी मदद के लिए धन्यवाद, लेकिन मुझे यकीन नहीं है कि मैं इस भाग को स्पष्ट रूप से समझ गया .... इसलिए बस यह सुनिश्चित करने के लिए कि मैंने आपको सही ढंग से समझा ... आप का मतलब है कि बाल वर्ग में IF कथन में SaveConfigParams I IF कथन के तहत कोड निष्पादित करेगा .... यदि यह सही है तो पैरेंट क्लास में parametrized SaveConfig प्रक्रिया की आवश्यकता क्या है? – MChan

+1

एक बच्चा वर्ग वैकल्पिक रूप से जांच सकता है कि क्या वांछित अगर पैरामीटर निर्दिष्ट किए गए थे, और यदि पता चला तो उसके व्यवहार को तदनुसार समायोजित करें, अन्यथा केवल उन्हें अनदेखा करें और कुछ और करें। यह पूरा बिंदु है - पैरामीटर वैकल्पिक हैं, लेकिन माता-पिता में संग्रहीत हैं जहां प्रत्येक बच्चा चाहें तो देख सकता है। यही कारण है कि आपने मूल रूप से पूछा - पैरामीटर का समर्थन करने के लिए हर जगह परिवर्तन करना है। आखिरकार, बेहतर विकल्प बुलेट को काटने और वैकल्पिक इनपुट पैरामीटर देने के लिए 'SaveConfig()' को बदलने के लिए है, और फिर प्रत्येक बच्चे में वह परिवर्तन करें। आपका कोड इसके लिए क्लीनर होगा। –

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