Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конструктор в наследуемом классе. 
V
    Опции темы
Felixx
Дата 12.10.2011, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Доброго время суток. У меня имеется проблемка небольшая, подскажите пожалуйста что не так сделано?..
Суть проблемы такова:

Имеем абстрактный класс:
Код

public class PackageBuilder
{
    private byte[] buffer = new byte[] { };

     ..... куча методов.
}


1й наследник:
Код

public abstract class PBLoginPacket : PackageBuilder
{
        public PBLoginPacket()
        {
            try
            {
                this.WriteImpl();
            }
            catch (Exception e)
            {
                Console.Write(e.StackTrace);
            }
            ..... куча методов.
            
            protected abstract void WriteImpl();
        }
}


2й Наследник:

Код

class PROTOCOL_LOBBY_CREATE_ROOM_ACK : PBLoginPacket
{
        public PROTOCOL_LOBBY_CREATE_ROOM_ACK()
        {
            System.Console.WriteLine("test1");
        }

        protected override void WriteImpl()
        {
            System.Console.WriteLine("test2");
        }
}



В консоль выводитса:
test2
test1

тоесть сначало из метода WriteImpl и только потом из конструктора.. С чем это может быть связано? Может что то не так написано?
PM MAIL   Вверх
mes
Дата 12.10.2011, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: нет
Всего: 250



конструктор предка выполняется раньше конструктора наследника..



--------------------
PM MAIL WWW   Вверх
Felixx
Дата 12.10.2011, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Цитата(mes @ 12.10.2011,  21:47)
конструктор предка выполняется раньше конструктора наследника..

А как тогда можно сделать? метод вить абстрактный..
Убрать метод из предка и выполнять его руками в наследнике получаетса?
PM MAIL   Вверх
mes
Дата 12.10.2011, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: нет
Всего: 250



Цитата(Felixx @  12.10.2011,  20:50 Найти цитируемый пост)
? метод вить абстрактный..

проблема не в методе, а в очередности выполнения констукторов..  если надо выполнить после конструктора наследника, то это можно выполнить только "извне"
то, есть тот кто создает объект, должен вызвать и этот метод.. 



--------------------
PM MAIL WWW   Вверх
math64
Дата 13.10.2011, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: нет
Всего: 72



Я уже ответил в старом месте темы в форуме С++
Поясню, почему в конструкторе (C#) лучше не вызывать виртуальные методы:
Код

public abstract class A {
public A() { f(); }
protected abstract void f();
}
public class B : A {
public B() { buffer = new char[1]; }
protected overload void f() { buffer[0] = 'B'; } // Программа здесь вылетит, поскольку переменная buffer ещё не инициализирована
private char[] b;
}

В С++ поведение конструктора при вызове виртуальных методов безопаснее: если бы f() был бы не абстрактным, вызвался вы A::f().
Решение может быть например такое:
Код

public abstract class A {
public A() { f_forA(); }
protected virtual void f() {f_forA(); }
private void f_forA() { }
}
public class B : A {
public B() { buffer = new char[1]; }
protected overload void f() { f_forB(); }
private overload void f_forB() { buffer[0] = 'B'; }
private char[] b;
}


Добавлено @ 07:47
или такое:
Код

public abstract class A {
// Фабричный метод; поскольку A - абстрактный класс, закомментированный код не откомпилируется
// public static A create() { A a = new A(); a.f(); return a; }
// Конструктор защищен - создавать новые объекты через create
protected A() { }
protected abstract void f();
}
public class B : A {
public static B create() { B b = new B(); b.f(); return b; }
protected B() { buffer = new char[1]; }
protected overload void f() { buffer[0] = 'B'; }
private char[] b;
}


Это сообщение отредактировал(а) math64 - 13.10.2011, 08:27
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0504 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.