2012-05-28 24 views
6

से पूर्ण वापसी मेरे पास वर्चुअल बेस विधि void Action() है जो व्युत्पन्न कक्षा में ओवरराइड है।सी # - बेस विधि

कार्रवाई में पहला चरण base.Action() पर कॉल करना है। यदि आधार विधि में कोई स्थिति होती है तो मैं नहीं चाहता कि बाकी व्युत्पन्न विधि संसाधित हो।

मैं जानना चाहता हूं कि कोई कीवर्ड या डिज़ाइन पैटर्न है जो मुझे बेस विधि से व्युत्पन्न विधि से बाहर निकलने की अनुमति देगा।

वर्तमान में मैं बूल के लिए शून्य को बदलने और प्रवाह नियंत्रण के रूप में इसका उपयोग करने के लिए देख रहा हूं, लेकिन मैं सोच रहा था कि क्या कोई अन्य डिज़ाइन पैटर्न उपयोग करने में सक्षम हो सकता है।

+0

नहीं, यह कोई त्रुटि स्थिति नहीं है इसलिए अपवाद काम नहीं करेंगे। – Talib

+0

क्षमा करें लाभ (समाधान की आवश्यकता नहीं होने के बारे में पिछली पोस्ट हटा दी गई), मुझे अभी भी एक समाधान की आवश्यकता है, सिस्टम काफी जटिल हो रहा है। असल में कोड में कहीं और क्रेडिट्स उपलब्ध नहीं है। यदि कोई क्रेडिट उपलब्ध नहीं है तो मैं बेस क्लास में सभी कार्यों को अक्षम करने में सक्षम होना चाहता हूं। मैं कोड को डुप्लिकेट करने वाले व्युत्पन्न वर्ग के बिना ऐसा करने में सक्षम होना चाहता हूं। – Talib

उत्तर

3

void लौटे प्रकार के साथ यह प्रयोग न करें, लेकिन कर सकते हैं, का कहना है कि bool

public class Base 
{ 
    public virtual bool Action() 
    { 
     .. 
     return boolean-value. 
    } 
} 

public class Child : Base 
{ 
    public override bool Action() 
    { 
     if(!base.Action()) 
     return false; 

     .... 
     return boolean-value; 
    } 
} 

या, अगर यह एक असाधारण स्थिति है, एक अपवाद बढ़ा, जैसे अन्य सुझाव है।

+0

यह थोड़ा गन्दा है क्योंकि यह कक्षा के उपभोक्ता को अनावश्यक कार्यान्वयन का खुलासा करता है। – Slugart

+0

@Slugart: आप किस कार्यान्वयन के बारे में बात कर रहे हैं? – Tigran

+0

क्षमा करें मतलब कार्यान्वयन विस्तार - कार्रवाई अब इस तथ्य को उजागर करती है कि यह बूल देता है। व्युत्पन्न वर्ग के उपभोक्ता के लिए इसका क्या अर्थ है? – Slugart

3

क्या यह एक त्रुटि "स्थिति" है? यदि ऐसा है, तो बस इसे अपवाद फेंक दें, और ओवरराइड के भीतर अपवाद को न पकड़ें।

यदि यह कोई त्रुटि स्थिति नहीं है, तो वापसी प्रकार का उपयोग करना एक तरह से आगे की तरह लगता है, लेकिन यह आपके संदर्भ के लिए उपयुक्त नहीं हो सकता है - हम वास्तव में नहीं जानते कि आप क्या हासिल करने की कोशिश कर रहे हैं।

एक अन्य विकल्प का उपयोग करने के लिए है template method pattern:

public abstract class FooBase 
{ 
    public void DoSomething() 
    { 
     DoUnconditionalActions(); 
     if (someCondition) 
     { 
      DoConditionalAction(); 
     } 
    } 

    protected abstract void DoConditionalAction(); 
} 

आप आधार वर्ग सार बनाने के लिए नहीं करना चाहते हैं, तो आप कर सकते हैं यह एक संरक्षित आभासी तरीका है जिसके आधार वर्ग में कुछ नहीं करता है और ओवरराइड की गई है व्युत्पन्न कक्षा में जहां उचित हो। ध्यान दें कि DoSomething वर्चुअल यहाँ नहीं है।

यदि इनमें से कोई भी विकल्प उचित नहीं लगता है, तो आपको हमें प्राप्त करने की कोशिश करने के बारे में अधिक ठोस जानकारी प्रदान करने की आवश्यकता होगी।

0

आधार विधि में अपवाद फेंको। यह पकड़े जाने तक, प्रत्येक विधि से बाहर निकल जाएगा।

+0

एक विधि में अपवाद फेंकना जिसे अक्सर कहा जाता है, यह बहुत अच्छा विचार नहीं है। –

+0

@Mert: * असाधारण * स्थिति में यह एक अच्छा विचार है, लेकिन ** ** ** ** में नियंत्रण प्रवाह के लिए यह एक बुरा विचार है। – Tigran

+0

@Mert: अपवाद फेंकना अक्सर अच्छा नहीं है, लेकिन अपवाद केवल तभी फेंक दिया जाता है जब "स्थिति" होती है, जैसे ओपी इसे डालता है। यह हर बार होता है जब विधि कहा जाता है, क्योंकि सामान्य प्रवाह व्युत्पन्न विधि में शेष कोड को चलाने के लिए होता है। – Guffa