Поскольку A является абстрактным, вы можете добавить абстрактные методы в A и вызвать их из A и B, которые будут вынуждены реализовать метод, будет invoker:
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 }
}
При создании B, конструктор базового класса вызовет метод (), который реализуется только в B, заставляя экземпляр B быть вызванным.
Это позволяет A вызывать специальные методы подкласса, не требуя, чтобы A обладало конкретными знаниями о детях. Недостатком является то, что ВСЕ дети должны внедрять метод или повторно абстрагировать его на своих собственных детей.