web-dev-qa-db-fra.com

Empêcher le remplacement des méthodes individuelles en C #

Je sais que je peux utiliser le scellé afin d'empêcher d'autres classes d'hériter d'une certaine classe, mais est-il possible d'autoriser l'héritage mais d'empêcher la substitution de certaines méthodes virtuelles?

39
leeza

Seules les méthodes virtual peuvent être remplacées.
Oubliez simplement virtual, et votre méthode ne sera pas remplaçable.

40
SLaks

vous pouvez également utiliser un modificateur scellé pour empêcher une classe dérivée de surcharger davantage la méthode.

vérifier ceci: méthodes scellées

35
scatman

Oui. Le mot clé sealed peut également être utilisé sur les méthodes, pour indiquer qu'une méthode qui est virtuelle ou abstraite à des niveaux d'héritage plus élevés ne peut plus être héritée.

Si la méthode n'a jamais été virtuelle ou abstraite pour commencer, pas de soucis; il ne peut pas être outrepassé.

Notez que sealed affecte uniquement la substitution de méthode; La méthode masquage ne peut pas être arrêtée de cette manière, donc une classe enfant peut toujours déclarer une méthode new du même nom et de la même signature que votre méthode scellée.

14
KeithS

Vous pouvez obtenir le mot clé sealed pour travailler sur une méthode dans la classe abstraite en faisant cette classe abstraite elle-même dérivée de quelque chose:

abstract class DocumentTemplateBase
{
    public abstract void WriteTitle();
    public abstract void WriteSections();
}

abstract class DocumentTemplate : DocumentTemplateBase
{
    public override sealed void WriteTitle() 
    {
        Console.WriteLine("Project document"); 
    }

    public override sealed void WriteSections() 
    {
        Console.WriteLine("Sections");
    }

    abstract public void WriteContent();
}

Dérivant toujours votre classe concrète de la classe abstraite originale (et maintenant dérivée):

class Document1_FromTemplate : DocumentTemplate
{
    public override void WriteTitle() //error!
    {
        Console.WriteLine("Project1 document");
    }

"ne peut pas remplacer le membre hérité 'Dynamics.DocumentTemplate.WriteTitle ()' car il est scellé"

Cependant, rien n'empêche un implémenteur de new de le faire:

class Document1_FromTemplate : DocumentTemplate
{
    public new void WriteTitle() //sorry! can't stop it!
    {
        Console.WriteLine("Project1 document");
    }
9
James Wiseman

Vous pouvez utiliser le mot clé sealed de deux manières:

  1. Avant une classe pour éviter l'héritage.
  2. Avant une fonction pour éviter de passer outre.

Pour autoriser l'héritage, ne placez pas le mot clé sealed avant la classe et pour éviter de surcharger mettez sealed avant la fonction que vous ne souhaitez pas remplacer.

6
Bardia

Oui. vous devez utiliser remplacement prioritaire pour la méthode pour y parvenir.

1
Aravind