Je sens une odeur de code ici. Je suis d'avis que vous ne devriez hériter que d'une classe de base si vous implémentez toutes les fonctionnalités de cette classe de base. Ce que vous faites ne représente pas vraiment les principes orientés objet correctement. Ainsi, si vous voulez hériter de votre base, vous devriez implémenter Name, sinon vous héritez mal de votre héritage. Votre classe A devrait être votre classe de base et votre classe de base actuelle devrait hériter de A si c'est ce que vous voulez, et non l'inverse.
Cependant, ne pas s'éloigner trop loin de la question directe. Si vous avez voulez bafouer « les règles » et veulent continuer sur le chemin que vous avez choisi - voici comment vous pouvez aller à ce sujet:
La convention est de mettre en œuvre la propriété, mais jeter un NotImplementedException lorsque cette propriété est appelé - bien que je n'aime pas ça non plus. Mais c'est mon opinion personnelle et cela ne change rien au fait que cette convention est toujours en vigueur.
Si vous essayez de obsolète la propriété (et il est déclaré dans la classe de base comme virtuelle), alors vous pouvez soit utiliser l'attribut obsolète sur elle:
[Obsolete("This property has been deprecated and should no longer be used.", true)]
public override string Name
{
get
{
return base.Name;
}
set
{
base.Name = value;
}
}
(Edit: Comme Brian souligné dans les commentaires, le deuxième paramètre de l'attribut provoquera une erreur de compilation si quelqu'un référence la propriété Name, ainsi ils ne pourront pas l'utiliser même si vous l'avez implémenté dans la classe dérivée.)
Ou comme je l'ai mentionné, utilisez NotImplementedException:
public override string Name
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
Cependant, si la propriété n'est pas déclarée comme virtuelle, vous pouvez utiliser le nouveau mot-clé pour le remplacer:
public new string Name
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
Vous pouvez toujours utiliser l'attribut obsolète de la même manière que si la méthode a été substituée, ou vous pouvez lancer l'exception NotImplementedException, selon ce que vous choisissez. Je serais probablement utiliser:
[Obsolete("Don't use this", true)]
public override string Name { get; set; }
ou:
[Obsolete("Don't use this", true)]
public new string Name { get; set; }
Selon si oui ou non elle a été déclarée comme virtuelle dans la classe de base.
Ceci est une violation de l'un des principes de base de la POO (polymorphisme et, par conséquent, le 'L' dans SOLID). – jason
Spécifiquement une violation du principe de substitution de liskov (http://en.wikipedia.org/wiki/Liskov_substitution_principle) –
Beaucoup de réponses ignorent le simple fait que la classe de base peut être fournie par un tiers. Comme ce code n'appartient pas, il ne peut pas être modifié. Il est définitivement justifié de vouloir créer une version plus étroitement ciblée de la classe de base en cachant des membres. Et il est plus agréable d'hériter que d'utiliser le contrôle de base en tant que composant d'un nouveau contrôle car cela nécessite beaucoup de travail supplémentaire pour exposer les méthodes déjà trouvées sur la base. – Mario