Порядок вызова конструкторов в C#
От: GrigorievAnton  
Дата: 15.06.09 12:54
Оценка:
Задача такая: есть базовый класс и много наследников от него. В конструкторе всех классов нужно выполнить одинаковую последовательность действий, только с одним параметром, правила вычисления которого разные в различных классах. Я засунул эти вычисления в конструктор базового класса, а вычисление параметра вынес в отдельную виртуальную функцию, которую перекрываю в наследниках. Получается примерно так:


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
. Но решения там, к сожалению, не предложено. Также поиск подсказал, что если поля инициализировать не в конструкторе, а непосредственно при объявлении, эта инициализация будет выполнена раньше вызова базового конструктора. Но мне это не помогает, т.к. поля в потомках нужно инициализировать не константами, а значениями, переданными в качестве параметра в конструкторе.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.