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?
Seules les méthodes virtual
peuvent être remplacées.
Oubliez simplement virtual
, et votre méthode ne sera pas remplaçable.
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
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.
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");
}
Vous pouvez utiliser le mot clé sealed
de deux manières:
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.
Oui. vous devez utiliser remplacement prioritaire pour la méthode pour y parvenir.