Puisque A est abstraite, vous pouvez ajouter des méthodes abstraites à A et les invoquerez A et B, qui sera obligé de mettre en œuvre la méthode, sera l'invocateur:
abstract class A<T> where T:A
{
public event Action<T> Event1;
public abstract void Method();
public A(){Method();}
}
class B : A<B>
{
//has a field called Action<B> Event1;
public void Method(){ //stuff }
}
sur instanciation de B, le constructeur de la classe de base appellera() qui est uniquement mis en œuvre en B, forçant l'instance de B à appeler .
Cela permet à A d'invoquer des méthodes spécifiques à une sous-classe sans que A ait besoin d'avoir des connaissances spécifiques sur les enfants. L'inconvénient est que TOUS les enfants doivent implémenter la Méthode ou la résumer à leurs propres enfants.
Attention, une classe de base ne doit pas avoir une connaissance directe de celui-ci est sous-classe, il devient un sale de la dette technique. Dans ce cas, puisque c'est un générique ce n'est pas trop mal, mais juste en général. –
Ne voulez-vous pas dire «où T: A»? Eric Lippert a déjà écrit à ce sujet: http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx –