2009-08-25 7 views
5

इस इस तरह के बाद कुछ:विधि के साथ बेस क्लास को कैसे कार्यान्वित करें और अभी तक व्युत्पन्न कक्षा को ओवरराइड करने के लिए मजबूर करें?

public abstract class AAA 
{ 
    protected abstract virtual string ToString() // Error 
    { 
    // Base Stuff 
    } 
} 

public abstract class BBB : AAA 
{ 
    public override string ToString() 
    { 
    // Use base.ToString(); 
    // More Stuff 
    } 
} 

मैं एक पोस्ट पढ़ (abstract method in a virtual class) डायन था सुंदर मेरे सवाल की तरह है, लेकिन वहाँ एक छोटा सा फर्क है। मैं AAA.ToString() को आधार व्यवहार और प्राप्त करने के लिए व्युत्पन्न कक्षा को ओवरराइड करने के लिए मजबूर करना चाहता हूं।

मुझे पता है कि मैं ऐसा कुछ कर सकता हूं (नीचे स्क्रॉल करें) लेकिन मैं एक उचित तरीके की तलाश में था।

public abstract class AAA 
{ 
    public abstract string ToString(); 
    protected string ToString2() 
    { 
    // Base Stuff 
    } 
} 

public class BBB : AAA 
{ 
    public override string ToString() 
    { 
    // Use base.ToString2(); 
    // More Stuff 
    } 
} 

मैं भी शायद एक IAAA इंटरफेस बनाने के लिए और की तरह

public class BBB : AAA, IAAA { ... } 

मेरी बीबीबी वर्ग का निर्माण लेकिन मेरे लिए ठीक नहीं लग रही है हो सकता है।

उत्तर

5

आपका दृष्टिकोण अनिवार्य रूप से उचित तरीका है ...

संपादित करें:

आपका "विनिर्देश" है:

  1. डिफ़ॉल्ट व्यवहार
  2. आवश्यक ओवरराइड

अब, चूंकि आप ऐप करते हैं कान "डिफ़ॉल्ट व्यवहार" हमेशा क्रियान्वित किया जा करना चाहते हैं, तो आप

public string ToString() 
{ 
    // placeholder for some default behaviour 

    string result = doToString(); 

    // placeholder for some more default behaviour 

    return result; 
} 

protected abstract string doToString(); 

यह केवल काम करता है की जरूरत है अगर आप जानते हैं क्या आधार वर्ग सामान्य रूप में कर रहा है, और व्युत्पन्न वर्ग में doToString() के लिए कार्यान्वयन प्रदान करना चाहते हैं। इसे Template Method डिज़ाइन पैटर्न के रूप में जाना जाता है।

हालांकि, अगर आप देख रहे हैं के लिए एक रास्ता के लिए आवश्यकता होती है एक व्युत्पन्न वर्ग के implementer ToString() की इसके कार्यान्वयन में base.ToString() कॉल करने के लिए, तो यह करने के लिए कोई रास्ता नहीं है। ओवरराइड की अनुमति देकर, आप इसके कार्यान्वयन पर व्युत्पन्न कक्षा नियंत्रण देते हैं।

आप हमेशा base.ToString() पर कॉल करने के लिए अपनी सिफारिश दस्तावेज कर सकते हैं, लेकिन यह इसके बारे में है।

इंटरफ़ेस का उपयोग करके आपकी कक्षा के लिए सार्वजनिक अनुबंध परिभाषित किया जाता है। यह आपको टेम्पलेट विधि पैटर्न पर कोई अतिरिक्त लाभ नहीं देता है, क्योंकि आपको अभी भी "डिफ़ॉल्ट" कार्यान्वयन प्राप्त करने के लिए बेस क्लास से प्राप्त करने की आवश्यकता है।

क्या आपके पास अपनी मूल कक्षा में "डिफ़ॉल्ट व्यवहार" के रूप में प्रदान करने का प्रयास करने के बारे में कोई जानकारी है? शायद यह एक बेहतर समाधान में मदद मिलेगी। संदर्भित प्रश्न को देखते हुए, यह अनिवार्य रूप से एक ही दृष्टिकोण है।

+0

धन्यवाद, आपकी संपादित मुझे कुछ महत्वपूर्ण एहसास बनाया! यहां तक ​​कि अगर मुझे बेस क्लास में ToString() को परिभाषित करने के लिए एक चमत्कारिक तरीका मिलेगा और व्युत्पन्न कक्षा में ओवरराइड को मजबूर किया जाएगा, तो ToString() का उपयोग करने के लिए ओवरराइड को मजबूर करने का कोई तरीका नहीं है! मुझे इस पोस्ट को ओवरराइड को मजबूर करने के बारे में एक एमवीपी द्वारा भी मिला: http://social.msdn.microsoft.com/forums/en-US/csharplanguage/thread/c25b6477-b990-4284-abaf-801ddf18207c। फिर से धन्यवाद श्रीमान। – Tipx

+0

सेवा की खुशी है। वह पोस्ट मार्क ग्रेवल द्वारा है ... वह एसओ पर भी जाना जाता है :) –

+0

यह नीचे पोस्ट किए गए ओपीएस उत्तर के साथ तुलना कैसे करता है? विधि टेम्पलेट के लिए – Armbrat

0

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

2

मैं सिर्फ पता चला कि वास्तव में व्यवहार मैं चाहता था पाने के लिए क्या करना है:

public abstract class AAA 
{ 
    protected abstract string ToStringSpecific(); 
    protected string ToString() 
    { 
    // Base Stuff 
    ... 
    // Use this.ToStringSpecific(); 
    } 
} 

public class BBB : AAA 
{ 
    protected override string ToStringSpecific() 
    { 
    // Specific Stuff 
    } 
} 
+0

मुझे लगता है कि आपको अपना मूल प्रश्न संपादित करना चाहिए था ... – Armbrat

+0

मैं वास्तव में प्रश्न (और शीर्षक) संपादित करूँगा ताकि यह किसी को इस विषय को ढूंढने में मदद कर सके, लेकिन मैं अपना समाधान यहां दूंगा। (यदि इसे इस तरह से नहीं किया जाना चाहिए, तो ई "आपका प्रश्न पूछने वाला" बटन नहीं होगा) – Tipx

+0

मैंने अपनी टिप्पणी के दूसरे भाग को फिर से पढ़ा है और यह अहंकारी "लगता है"। मुझे इसके लिए खेद है, मेरा मतलब यह नहीं था, और मैं टिप्पणी संपादित नहीं कर सकता। मैं क्षमाप्रार्थी हूं। – Tipx