2008-09-04 23 views
12

J'ai des cours pondus comme çaPuis-je empêcher le remplacement d'une méthode virtuelle héritée dans les sous-classes?

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 
    } 
} 

Est-il possible d'empêcher la classe C de redéfinissant la méthode Render, sans casser le code suivant?

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

Répondre

31

Vous pouvez sceller des méthodes individuelles pour les empêcher d'être Overridable:

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

En B, faire

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

oui. Si vous marquez une méthode comme étant scellée, elle ne peut pas être redéfinie dans une classe dérivée.

2

Oui, vous pouvez utiliser le mot-clé scellé dans la mise en œuvre de la classe B de rendu:

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

    protected virtual void SpecialRender() 
    { 
    } 
} 
1

essayer sealed

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

class C : B 
    protected override void SpecialRender() 
    { 
    // not valid 
    } 
} 

Bien sûr, je pense que C peut se déplacer en étant new.

0

Un autre (? Meilleure) utilise probablby le nouveau mot-clé pour empêcher une méthode virtuelle particulière d'être 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

Toute explication pourquoi est-ce mieux? Scellé a une signification plutôt propre. Il dit "Après avoir réfléchi, je suis arrivé à la conclusion que cela ne devrait jamais être annulé". – Ivan