Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2011, 10:15   #1
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
Лампочка AfterConstruction, BeforeDestruction

При создании нового класса обычно переопределяют конструктор и диструктов (ну или Free). По крайней мере нас так учили. Там мы инициализируем и обнуляем соответственно поля объекта. Но в классе TObject определены две процедуры
Код:
    procedure AfterConstruction; virtual;
    procedure BeforeDestruction; virtual;
Не кажется ли вам, что именно они и задумывались как процедуры для инициализации и обнуления полей и выполнения всяческих действий.

Дополнительное замечание:
На использование AfterConstruction натолкнула такая ситуация.
Создаю свой класс исключения. Но после его создания мне нужно выполнить некоторые действия. Если написать:
Код:
constructor ESib.Create(const Msg: string);
begin
  inherited Create;
  <мои действия>
end;
, то при вызове исключения через, скажем, CreateFmt, <мои действия> не произведутся. А переопределять 12 конструкторов меня не вставляет.
Sibedir вне форума Ответить с цитированием
Старый 20.01.2011, 11:20   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Не кажется ли вам, что именно они и задумывались как процедуры для инициализации и обнуления полей и выполнения всяческих действий.
Может и так. А если какие-то не предусмотренные в исходном классе параметры передать конструктору? Без переопределения конструктора наверно слабо
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.01.2011, 11:32   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
А переопределять 12 конструкторов меня не вставляет.
Хех, меня бы тоже не вставило.
Цитата:
, то при вызове исключения через, скажем, CreateFmt, <мои действия> не произведутся.
Так делайте вот так:
Код:

constructor ESib.Create(const Msg: string);

begin

  <мои действия>

  inherited Create;

end;
_-Re@l-_ вне форума Ответить с цитированием
Старый 20.01.2011, 11:40   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Так делайте вот так:
Код:
constructor ESib.Create(const Msg: string);
begin
  <мои действия>
  inherited Create;
end;
Обычно <мои действия> связаны с объектами создаваемого компонента, поэтому чаще всего такой фокус не пройдет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.01.2011, 12:01   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Обычно <мои действия> связаны с объектами создаваемого компонента, поэтому чаще всего такой фокус не пройдет
Код:
constructor ESib.Create(const Msg: string);
begin
  inherited Create;
 // Здесь поля уже есть и с ними можно работать
  <мои действия>.
end;
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 20.01.2011, 12:48   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
На использование AfterConstruction натолкнула такая ситуация.
правильно мыслите, только на всяк inherited всетаки надо б вызывать.

они в общем то для подобных случаев и нужны.

в Делфи например так реализован класс RefObject(или как то так)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.01.2011, 13:19   #7
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

2 Пепел Феникса
А что за RefObject?

2 All
<мои действия> связаны не с полями объекта. Там исключение регистрируется в специальном списке.

Вообще, ощущение такое, что AfterConstruction ввели, для устронения косяков своих же программистов. Ну не логичнее было бы иметь всегда один конструктор, а при необходимости сделать
Код:
class function Exception.CreateFmt(const Msg: string; const Args: array of const): Exception;
begin
  Result := Create (Format(Msg, Args));
end;
а Create при этом сделать виртуальным.

Последний раз редактировалось Sibedir; 20.01.2011 в 13:22.
Sibedir вне форума Ответить с цитированием
Старый 20.01.2011, 16:28   #8
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Create и AfterConstruction введены для разных моделей инициацизации ресурса. Вот и всё.

Вы располагаете свои действия в том месте, где вам это нужно, согласно выбранной вами логике. Если для вас это значения не имеет, то обычно выбирают конструктор.

Как пример - предлагаю посмотреть на реализацию TThread или TCustomForm. Очень чёткая и доступная логика.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск