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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2019, 19:00   #1
Adult_Master
Пользователь
 
Регистрация: 04.04.2011
Сообщений: 63
По умолчанию Destroy без Inherited

Всем привет ! Есть у меня модуль, не мой, править его не хоца. В модуле описан класс (класс большой, повырезал лишнее, что бы было меньше букав):
Код:
TBitmapFont = class  
 protected
  FImage: TAtlasImage;
 public
  constructor Create();
  destructor Destroy; override; 
 end;
 
implementation

destructor TBitmapFont.Destroy;
begin
  try
    FImage.Free;
    FKernings.Free;
  finally
    Decrement_PXL_ClassInstances;
  end;

  inherited;
end;
На базе этого класса я создаю свой класс:

Код:
 TGameFont = class( TBitmapFont )
  public
   destructor Destroy; override;
 end;

implementation

destructor TGameFont.Destroy;
begin
 try
  Kernings.Free;
 finally
   Decrement_PXL_ClassInstances;
 end;

 inherited;
end;
Как видите, мне не нужно уничтожать FImage при уничтожении класса, т.к. этот объект используется другими классами. Но при вызове inherited произойдёт вызов родительского деструктора, и FImage будет уничтожен. Так вот, правильно ли НЕ вызывать inherited;, учитывая что родительский класс ни от чего не унаследован. Я просто ВСЕГДА вызываю родительский дестрой,как когда то прочитал в документации. Или как вообще лучше поступить в моём случае ?
Adult_Master вне форума Ответить с цитированием
Старый 15.04.2019, 19:58   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Класс у вас у расследован.
Цитата:
Сообщение от Adult_Master Посмотреть сообщение
Так вот, правильно ли НЕ вызывать inherited;, учитывая что родительский класс ни от чего не унаследован
Разработчики так делают.
http://docwiki.embarcadero.com/RADSt...ethods_(Delphi)

inherited нужен только когда у вас есть наследование.

Цитата:
Сообщение от Adult_Master Посмотреть сообщение
Как видите, мне не нужно уничтожать FImage при уничтожении класса, т.к. этот объект используется другими классами.
Абсолютно не вижу. Кто создал класс тот и должен его развоплощать.
Цитата:
Сообщение от Adult_Master Посмотреть сообщение
destructor TBitmapFont.Destroy;
begin
try
FImage.Free;
FKernings.Free;
finally
Decrement_PXL_ClassInstances;
end;

inherited;
end;
Так что тут либо Free либо Decrement_PXL_ClassInstances лишнее.

Цитата:
Сообщение от Adult_Master Посмотреть сообщение
Или как вообще лучше поступить в моём случае ?
Я интерфейсы использую.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 15.04.2019, 20:27   #3
Adult_Master
Пользователь
 
Регистрация: 04.04.2011
Сообщений: 63
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Разработчики так делают.
http://docwiki.embarcadero.com/RADSt...ethods_(Delphi)
Я делаю так же, но тут иная ситуация.

Цитата:
Сообщение от Pavia Посмотреть сообщение
Абсолютно не вижу. Кто создал класс тот и должен его развоплощать.
FImage - объект, который создаёт класс внутри себя, я для того и хочу переопределить некоторые методы класса, что бы подсовывать ему свой FImage, но т.к. этот объект будет использоваться и другими классами, совершенно негоже, что бы его уничтожали классы его использующие.
Цитата:
Сообщение от Pavia Посмотреть сообщение
Так что тут либо Free либо Decrement_PXL_ClassInstances лишнее.
Понятно, наверное проще переписать класс под себя.
Adult_Master вне форума Ответить с цитированием
Старый 16.04.2019, 09:36   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
повырезал лишнее,
после вырезания получилось... иерархия классов неверная.
Цитата:
Есть у меня модуль, не мой,
увы...(либо вырезанное не является лишним).

Цитата:
Как видите, мне не нужно уничтожать FImage при уничтожении класса,
и откуда же это видно? видно только то что его уничтожают.
для того чтобы увидеть это(необходимость "посмертного" существования), нужен тот ВНЕШНИЙ код в котором ИСПОЛЬЗУЮТ оный объект после... а вовсе не эти Destroy.

если уничтожение НЕ нужно нужно НЕ всегда, можно в базовый класс добавить
Код:
 protected property noautodestroyImage: boolean;
задавать "стандартное поведение" в конструкторах (и базового класса и любых наследников) и использовать это в Destroy БАЗОВОГО класса.
Код:
if not noautodestroyImage then FImage.Free;
или даже сделать это свойством TAtlasImage.
НО inherited Destroy лучше оставлять, для гарантии что ИЗМЕНЕНИЕ в будущем(когда о существовании inherited Destroy; благополучно забыто) базового класса не приведет к проблемам.

большинство ошибок именно так и возникает (сделали а потом забыли условия применениятребования).

а еще лучше сделать Fimage: TAtlasImage настраиваемым внешним property.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 16.04.2019 в 09:43.
evg_m вне форума Ответить с цитированием
Старый 16.04.2019, 09:48   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
а еще лучше сделать Fimage: TAtlasImage настраиваемым внешним property
и ни каких править его не хоца ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.04.2019, 11:13   #6
Adult_Master
Пользователь
 
Регистрация: 04.04.2011
Сообщений: 63
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
после вырезания получилось... иерархия классов неверная.
Иерархия классов верная, как написано, так и есть.

Цитата:
Сообщение от evg_m Посмотреть сообщение
и откуда же это видно? видно только то что его уничтожают.
Видно отсюда, это мой класс, и я показываю зачем перекрываю Destroy:

Код:
destructor TGameFont.Destroy;
begin
 try
  Kernings.Free;
 finally
   Decrement_PXL_ClassInstances;
 end;

 inherited;
end;
Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
 protected property noautodestroyImage: boolean;
Код:
if not noautodestroyImage then FImage.Free;
а еще лучше сделать Fimage: TAtlasImage настраиваемым внешним property.
Я же сразу сказал: базовый класс не мой и главная цель - не вносить в него какие либо изменения.

В общем, всем спасибо за дискуссию, я уже переписал класс под себя, всё работает как надо, это оказалось оптимальным решением.

Последний раз редактировалось Adult_Master; 16.04.2019 в 11:15.
Adult_Master вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Наследование класса, ошибка при inherited. alextrof94 Общие вопросы Delphi 16 19.04.2013 15:36
xForm.Destroy BoozZzilla Общие вопросы Delphi 6 24.03.2011 14:27
Destroy формы SNUPY Общие вопросы Delphi 9 09.02.2010 11:02
DBGrid.destroy; - ? Evgenii Компоненты Delphi 3 01.09.2009 08:26
NForm.Destroy; Манжосов Денис :) Общие вопросы Delphi 3 03.08.2008 22:42