Задача такая: есть базовый класс и много наследников от него. В конструкторе всех классов нужно выполнить одинаковую последовательность действий, только с одним параметром, правила вычисления которого разные в различных классах. Я засунул эти вычисления в конструктор базового класса, а вычисление параметра вынес в отдельную виртуальную функцию, которую перекрываю в наследниках. Получается примерно так:
class BaseClass
{
public BaseClass(...)
{
int param = GetParam(...);
// Здесь реализация одинакового для всех классов алгоритма,
// в котором есть зависимость от param
}
protected virtual int GetParam(...)
{
// Вычисляем параметр по алгоритму для BaseClass
}
}
class AncestorClass : BaseClass
{
public AncestorClass(...)
: base(...)
{
// Инициализация полей AncestorClass
}
protected override int GetParam(...)
{
// Вычисляем параметры по алгоритму для AncestorClass
}
}
Возникает следующая проблема: реализация GetParam для AncestorClass использует поля этолго класса, которые инициализируются в его конструкторе. Но эта инициализация выполняется после того, как будет вызван базовый конструктор, поэтому AncestorClass.GetParam возвращает неправильное значение. К сожалению, самому выбрать момент вызова унаследованного конструктора, как в Delphi, в C# нельзя. Нет ли какого-то другого способа в базовом классе написать код так, чтобы он выполнялся сразу после того, как отработает код конструктора наследника?
Нашёл обсуждение похожей темы
здесьАвтор: Plutonia Experiment
Дата: 26.04.04
. Но решения там, к сожалению, не предложено. Также поиск подсказал, что если поля инициализировать не в конструкторе, а непосредственно при объявлении, эта инициализация будет выполнена раньше вызова базового конструктора. Но мне это не помогает, т.к. поля в потомках нужно инициализировать не константами, а значениями, переданными в качестве параметра в конструкторе.