Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C# вызов конструктора родителя

17K
01 февраля 2007 года
Mexes
10 / / 19.08.2006
В язык встроен следующим механизм вызова родительского конструктора

 
Код:
class B : A
{
    public B(params) : base(params)
    {
        //Действия
    }
}


По сути действия в таком порядке:
1) конструктор B вызывает конструктор A;
2) конструктор B выполняет собственные действия.

Мне необходимо поменять их местами, т. е.:

 
Код:
class B : A
{
    public B(params)
    {
        //Заполнение данных
        base(params); //Вызов конструктора родителя
    }
}



Возможно ли это сделать в шарпе?
309
01 февраля 2007 года
el scorpio
1.1K / / 19.09.2006
Нет, нельзя - ведь в конструкторе могуть вызываться методы этого же класса, и нельзя допустить, чтобы они обратились к данным базовых классов, которых ещё не существует.
1.9K
01 февраля 2007 года
[*]Frosty
278 / / 17.06.2006
Просто это ООП, а там по смыслу - перед конструктором производного класса должен быть вызван конструктор базового и усе, если ты его явно не укажишь, то будет вызван конструктор по-умолчанию)
А зачем те вообще это понадобилось вот в чем вопрос)

Конструктор это тока инициализация класса и все. Там недолжно быть ничего лишнего)
17K
03 февраля 2007 года
Mexes
10 / / 19.08.2006
Если интересно зачем, то:
 
Код:
public A(parameter list)
{
    // Инициализация (копирование) по parameter list (1)
    // Инициализация полей (вычисление), зависящих от params (2)
}


От A унаследованы B и C, от них еще дальше B1, B2, B3... C1, C2,... и т. д.

Есть много окольных путей, интересовало, можно ли (2) оставить в базовом конструкторе, а (1) явно выполнять в конструкторах потомка.

Вроде пока выкрутился, но не очень доволен :confused:
309
03 февраля 2007 года
el scorpio
1.1K / / 19.09.2006
Mexes
Инициализировать поля "этого" класса можно каким угодно способом.
А вот инициализация (вызов конструктора) базового класса всегда происходит перед выполнением конструктора производного класса
17K
03 февраля 2007 года
Mexes
10 / / 19.08.2006
Цитата: el scorpio

[...] А вот инициализация (вызов конструктора) базового класса всегда происходит перед выполнением конструктора производного класса



Я это знаю, тема и создавалась по вопросу обхода этого свойства языка.

309
04 февраля 2007 года
el scorpio
1.1K / / 19.09.2006
Как вариант, можно попытаться изменить порядок списка инициализации:
 
Код:
TMyClass::TMyClass (TParams &Params): Field1 (Params.Field1), Field2 (Params.Field2), TBaseClass()
{
// Тело конструктора
}

Но на работу конструтора базового класса предварительное объявление полей производного никак не повлияет. Так как "виртуализация" в конструкторе не работает, следовательно, обратиться к этим данным невозможно.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог