Si votre classe de base ne quelque chose dans la méthode, mais vous voulez vous assurer que chaque sous-classe est obligé de mettre en œuvre certaines partie de la méthode, alors vous voulez le Template Method pattern, comme décrit dans la réponse de Marc Gravell.
Il n'existe aucun moyen de fournir une implémentation par défaut dans votre classe de base et forcez toujours les sous-classes à fournir leur propre implémentation. Vous pouvez cependant créer une classe de base abstraite et en hériter pour fournir l'implémentation par défaut, mais rendre cette classe concrète scellée.
public abstract class FooBase {
public abstract void DoStuff();
}
public sealed class FooImpl : FooBase {
public override void DoStuff {
//default widget-munging code
}
}
Maintenant, toutes les classes qui héritent de FooBase doivent mettre en œuvre DoStuff(), mais vous avez une implémentation par défaut FooImpl à partir de laquelle les sous-classes ne peuvent pas hériter.
Vous pouvez également préférer déléguer la responsabilité de l'implémentation de la méthode à une classe distincte, qui est transmise à la classe de base dans son constructeur. C'est ce qu'on appelle le Strategy pattern.
public sealed class Foo {
private IFooStrategy _strategy;
public Foo(IStrategy strategy) {
_strategy = strategy;
}
void DoStuff() {
_strategy.DoStuff();
}
public static IFooStrategy DefaultStrategy {
//return singleton instance of the default strategy
}
}
Maintenant, au lieu de Foo sous-classement, vous créez au lieu de nouvelles implémentations de l'interface IFooStrategy et passer ceux à votre instance Foo. Donc soit vous pouvez faire:
new Foo(Foo.DefaultStrategy);
ou
new Foo(new DifferentStrategy());
Et vous pourriez avoir voulu mentionner le motif Template Method (ou bien vous avez peut-être tiré pour la brièveté) –
Qu'en est-il du mot clé "virtual" avant la méthode DoSomething? – Kamarey
@Kamarey La méthode DoSomething n'est pas virtuelle: c'est la méthode DoSomethingCore que les sous-classes sont censées remplacer/implémenter. – ChrisW