Personnellement, je pense qu'il s'agit d'une odeur de code.
Comme vous le dites, à moins qu'elles n'aient une fonctionnalité de base - ce qui n'est pas le cas -, elles devraient être abstraites, obligeant les classes dérivées à fournir une implémentation.
Si certaines classes dérivées n'ont pas d'implémentation pour ces méthodes, il y a probablement quelque chose qui ne va pas dans la conception.
Considérez ceci :
public abstract class Animal
{
public abstract string Speak();
}
public class Dog : Animal
{
public override string Speak()
{
Console.WriteLine("Woof");
}
}
public class Cat : Animal
{
public override string Speak()
{
Console.WriteLine("Meow");
}
}
Tout va bien jusqu'à présent, mais que se passe-t-il si vous voulez ajouter un animal qui ne parle pas ?
public class Ant : Animal
{
public override string Speak()
{
// do nothing - ants don't speak.
}
}
À mon avis, c'est une mauvaise chose. Quelqu'un pourrait faire cela (ce que vous avez décrit).
public abstract class Animal
{
public string Speak()
{
// not abstract because not all derived animals speak.
}
}
À mon avis, c'est mieux, mais ce n'est pas encore génial. Ce que j'aimerais voir dans cette situation, c'est que Speak soit déplacé vers une interface et que seuls les animaux qui peuvent parler l'implémentent, ou quelque chose comme ça.
public abstract class Animal
{
}
public abstract class Mammal : Animal
{
public abstract string Speak();
}
public class Dog : Mammal
{
public override string Speak()
{
Console.WriteLine("Woof");
}
}
public class Cat : Mammal
{
public override string Speak()
{
Console.WriteLine("Meow");
}
}
public class Ant : Animal
{
}