Вы могли бы сделать следующее, но это рискованно (см. Мои правки ниже):
public class Parent
{
public Parent()
{
Initialize();
}
protected virtual void Initialize()
{
// do stuff
}
}
public class Child : Parent
{
protected override void Initialize()
{
// do child stuff
base.Initialize();
}
}
Редактировать
Как предлагается в комментарии Терренса ниже, это рискованный подход, потому что Initialize()
будет выполнен до выполнения конструктора Child
. Если есть какие-либо поля, инициализированные в конструкторе Child
, они не будут готовы, если они используются Initialize()
. Это может привести к ошибочным ошибкам.
Простым решением было бы отказаться от родительского вызова Initialize()
и вместо этого иметь дочерние классы вызова Initialize()
. Как предлагали другие, другой вариант - использовать абстрактный шаблон фабрики.
Вот простое решение, которое использует статический фабричный метод:
class Program
{
static void Main()
{
Child.Create(() => new Child(5));
Console.ReadKey();
}
}
public abstract class Parent
{
protected virtual void Initialize()
{
Console.Write(" is the number.");
}
public static TChild Create<TChild>(Func<TChild> childGetter)
where TChild : Parent
{
var child = childGetter();
child.Initialize();
return child;
}
}
public class Child : Parent
{
private int _number;
public Child(int number)
{
_number = number;
}
protected override void Initialize()
{
Console.Write(_number.ToString());
base.Initialize();
}
}