2008-09-04 16 views
12

मैं कुछ इसक्या मैं वंचित वर्चुअल विधि को सबक्लास में ओवरराइड होने से रोक सकता हूं?

class A 
{ 
    public virtual void Render() 
    { 
    } 
} 
class B : A 
{ 
    public override void Render() 
    { 
     // Prepare the object for rendering 
     SpecialRender(); 
     // Do some cleanup 
    } 

    protected virtual void SpecialRender() 
    { 
    } 
} 
class C : B 
{ 
    protected override void SpecialRender() 
    { 
     // Do some cool stuff 
    } 
} 

तरह से बाहर रखी यह निम्न कोड को तोड़ने के बिना, प्रस्तुत विधि अधिभावी से सी क्लास को रोकने के लिए संभव है श्रेणियां होती हैं?

A obj = new C(); 
obj.Render();  // calls B.Render -> c.SpecialRender 

उत्तर

31

आप उन्हें overridable होने से रोकने के लिए अलग-अलग तरीकों से सील कर सकते हैं:

public sealed override void Render() 
{ 
    // Prepare the object for rendering   
    SpecialRender(); 
    // Do some cleanup  
} 
1

बी में कर

protected override sealed void Render() { ... } 
0

हाँ। यदि आप एक विधि को मुहरबंद के रूप में चिह्नित करते हैं तो इसे व्युत्पन्न कक्षा में ओवरराइड नहीं किया जा सकता है।

2

हाँ, आप रेंडर के बी वर्ग के क्रियान्वयन में सील कीवर्ड का उपयोग कर सकते हैं:

class B : A 
{ 
    public sealed override void Render() 
    { 
     // Prepare the object for rendering 
     SpecialRender(); 
     // Do some cleanup 
    } 

    protected virtual void SpecialRender() 
    { 
    } 
} 
1

, sealed

class B : A 
{ 
    protected sealed override void SpecialRender() 
    { 
    // do stuff 
    } 
} 

class C : B 
    protected override void SpecialRender() 
    { 
    // not valid 
    } 
} 
बेशक

कोशिश मुझे लगता है कि सी new द्वारा किया जा रहा यह मिल सकता है।

0

एक अन्य (? बेहतर) तरीका probablby नया खोजशब्द उपयोग कर रहा है overiden किया जा रहा से एक विशेष आभासी विधि को रोकने के लिए:

class A 
{ 
    public virtual void Render() 
    { 
    } 
} 
class B : A 
{ 
    public override void Render() 
    { 
     // Prepare the object for rendering  
     SpecialRender(); 
     // Do some cleanup  
    } 
    protected virtual void SpecialRender() 
    { 
    } 
} 
class B2 : B 
{ 
    public new void Render() 
    { 
    } 
} 
class C : B2 
{ 
    protected override void SpecialRender() 
    { 
    } 
    //public override void Render() // compiler error 
    //{ 
    //} 
} 
+1

कोई स्पष्टीकरण क्यों है बेहतर? मुहरबंद एक साफ अर्थ है। यह कहता है "कुछ सोचने के बाद मैं इस निष्कर्ष पर आया कि इसे कभी भी ओवरराइड नहीं किया जाना चाहिए"। – Ivan

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

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