2009-06-23 19 views
5

चलो कहते हैं कि मैं निम्नलिखित कोड डालें:सी # विरासत

interface ISomeInterface 
{ 
    void DoSomething(); 
    void A(); 
    void B();  
} 

public abstract class ASomeAbstractImpl : ISomeInterface 
{ 
    public abstract void A(); 
    public abstract void B(); 
    public void DoSomething() 
    { 
     // code here 
    } 
} 

public class SomeImpl : ASomeAbstractImpl 
{ 
    public override void A() 
    { 
     // code 
    } 

    public override void B() 
    { 
     // code 
    } 
} 

समस्या यह है कि मैं ASomeAbstractImpl.DoSomething() विधि सील (अंतिम) अत: कोई अन्य वर्ग इसे लागू कर सकता है करना चाहते हैं। कोड के रूप में अब SomeImpl में DoSomething() नामक एक विधि हो सकती है और इसे कहा जा सकता है (यह अमूर्त वर्ग से उसी नाम के साथ विधि को ओवरराइड नहीं करेगा, क्योंकि यह वर्चुअल के रूप में चिह्नित नहीं है), फिर भी मैं इसे काटना चाहता हूं SomeImpl कक्षा में ऐसी विधि को लागू करने की संभावना।

क्या यह संभव है?

उत्तर

9

सी # में तरीके डिफ़ॉल्ट रूप से बंद कर दिए गए हैं। हालांकि, कुछ भी नहीं है जो आप विधि छिपाने से रोकने के लिए कर सकते हैं (व्युत्पन्न कक्षा में समान नाम के साथ एक विधि का खुलासा करना, आमतौर पर new के साथ)।

या, उस बात के, इंटरफ़ेस-reimplementation के लिए:

static void Main() 
{ 
    ISomeInterface si = new EvilClass(); 
    si.DoSomething(); // mwahahah 
} 

public class EvilClass : ASomeAbstractImpl, ISomeInterface 
{ 
    public override void A() {} 
    public override void B() { } 
    void ISomeInterface.DoSomething() 
    { 
     Console.WriteLine("mwahahah");    
    } 
} 
2

सभी तरीकों डिफ़ॉल्ट रूप से सील कर रहे हैं, लेकिन वहाँ सदस्य छिपा को रोकने का कोई रास्ता नहीं है।

जब भी आप कोई सदस्य छिपाते हैं तो सी # कंपाइलर एक कंपाइलर चेतावनी जारी करेगा, लेकिन इसके अलावा, आप इसे रोक नहीं सकते हैं।

+5

यदि आप दुर्घटना से ऐसा करते हैं तो यह केवल एक चेतावनी जारी करेगा; "नया" क्वालीफायर जोड़ें और यह बंद हो जाता है ... –

0

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

http://msdn.microsoft.com/en-us/library/aa645769(VS.71).aspx

0

अगर SomeImpl वर्ग DoSemthing विधि होता है, यह गुप्त रखता है मूल एक पर हावी नहीं होता है।

0

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

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