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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2009, 22:44   #11
Sergey2
Форумчанин
 
Регистрация: 08.01.2008
Сообщений: 233
По умолчанию

А поповоду вызова в Destroy потомка дестроя предка.... Вот в приведенном примере базовый клас создается "снуля". Т.е. нет предка, зачем в его Destroy вызывать inherited;?
А если бы там был не TStringList, а какой-нить integer, то нужно ли вызывать дестрой предка?
Sergey2 вне форума Ответить с цитированием
Старый 08.08.2009, 22:58   #12
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)потому что корневой дестрой это освобождение памяти
2)можно оставить старый от TObject(о нем выше сказал)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.08.2009, 23:01   #13
Sergey2
Форумчанин
 
Регистрация: 08.01.2008
Сообщений: 233
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
1)потому что корневой дестрой это освобождение памяти
2)можно оставить старый от TObject(о нем выше сказал)
Все, понял, спасибо. Надо было просто хорошенько подумать

А насколько корректно создание классов без конструкторов и деструкторов?
Объясняю смысл. Есть несколько разношерстных объектов. Обсолютно разные данныЕ, абсолютно раззные задачи. Но при запуске программы нужно в них загрузить данные, и в конце сохранить.
Что мне думается. Создать TList, туда запихнуть указатели на эти объеты. И в цикле вызывать у них метод Load и Save соответсвенно. Но если они будут разных классов, то в цикле так не получится. Поэтому делаем базовый клас, который имеет только две функции Load и Save, а классы этих объетов наследуем от этого базового класса с переназвачением этих функций. И в цикле мы работаем с этими объектами как с членами базового класса. Т.е. базовый клас чисто шаблон, без начинки.
Нужно ли в базовом класе делать Create и Destroy? Ну с Create понятно - ненадо. А Destroy?
Я так понимаю что когда создается объект класса предка, то на него выделяется память от базового класса и от класса потомка. Если вызвать Destroy этого объекта то освободится память потомка, а память предка нет. Я правильно понимаю?

Последний раз редактировалось Stilet; 10.08.2009 в 09:59.
Sergey2 вне форума Ответить с цитированием
Старый 08.08.2009, 23:44   #14
Mixasik
New Delphi Coder
Форумчанин Подтвердите свой е-майл
 
Аватар для Mixasik
 
Регистрация: 20.07.2008
Сообщений: 874
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
Угу. Если вызывать метод родителя не нужно - его можно перекрывать, иначе директива override обязательна
А разве нельзя в не "ovveride" методе вызвать inherited или же он не будет работать, но точно не ругается на вызов.
Страх это слабость и потому, кто испугался уже побежден.
Mixasik вне форума Ответить с цитированием
Старый 08.08.2009, 23:50   #15
Sergey2
Форумчанин
 
Регистрация: 08.01.2008
Сообщений: 233
По умолчанию

Цитата:
Сообщение от Mixasik Посмотреть сообщение
А разве нельзя в не "ovveride" методе вызвать inherited или же он не будет работать, но точно не ругается на вызов.
Я так понимаю что связь с предком теряется и родителькая функция не вызывается. Это, кстати, легко проверить.....
Sergey2 вне форума Ответить с цитированием
Старый 08.08.2009, 23:57   #16
Mixasik
New Delphi Coder
Форумчанин Подтвердите свой е-майл
 
Аватар для Mixasik
 
Регистрация: 20.07.2008
Сообщений: 874
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  ttest = class
    k : integer;
    constructor create(i : integer);
  end;
 ttest2= class(ttest)
   constructor create(_k: integer);
 end;

var
  Form1: TForm1; test : ttest2;

implementation

{$R *.dfm}

{ ttest }

constructor ttest.create(i: integer);
begin
k := i;
end;
constructor ttest2.create(_k: Integer);
begin
  inherited create(_k);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
test := ttest2.create(5);
showmessage(inttostr(test.k));
end;

end.
В итоге выдает 5, а если бы не вызывался метод предка тобыло бы ноль.

Цитата:
Only virtual and dynamic methods can be overridden. All methods, however, can be overloaded; see Overloading methods.
Только виртуальные и динамические методы могут быть перекрыты.
Цитата:
override перекрывает уже виртуальный или динамический метод. Если эту директиву не писать, то метод будет переопределён заново, а не перекрыт.
Страх это слабость и потому, кто испугался уже побежден.

Последний раз редактировалось Mixasik; 09.08.2009 в 00:07.
Mixasik вне форума Ответить с цитированием
Старый 09.08.2009, 01:28   #17
Sergey2
Форумчанин
 
Регистрация: 08.01.2008
Сообщений: 233
По умолчанию

Непонял по поводу "переопределен" и "перекрыт". Какая разница? Если и в первом и во втором случаи можно вызвать функцию предка?
Sergey2 вне форума Ответить с цитированием
Старый 09.08.2009, 02:27   #18
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Цитата:
Непонял по поводу "переопределен" и "перекрыт". Какая разница? Если и в первом и во втором случаи можно вызвать функцию предка?
Не, это я с определениями напутал Перекрыть - override, переопределить - hide.
Вот так видно отличие overrided-методов
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TBaseClass = class
    procedure test; virtual;
  end;

  TOverrided = class(TBaseClass)
    procedure test; override;
  end;

  THidden = class(TBaseClass)
    procedure test;
  end;

var
  Base, Overrided, Hidden: TBaseClass;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TBaseClass.test;
begin
  ShowMessage('Base test');
end;

procedure TOverrided.test;
begin
  ShowMessage('Overrided test');
end;

procedure THidden.test;
begin
  ShowMessage('Hidden test');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Base      := TBaseClass.Create;
  Overrided := TOverrided.Create;
  Hidden    := THidden.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Base.test
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Overrided.test
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Hidden.test   
end;

end.
Вместо Hidden.test будет вызван Base.test, а Overrided.test отработает нормально.
Base, Overrided и Hidden обьявлены как TBaseClass, т.к. это их общий предок (точно так же многие функции принимают в качестве параметра базовый TStream, которым может быть TMemoryStream, TFileStream, TStringStream...)


Цитата:
А поповоду вызова в Destroy потомка дестроя предка.... Вот в приведенном примере базовый клас создается "снуля". Т.е. нет предка, зачем в его Destroy вызывать inherited;?
Он создаётся не с нуля, по умолчанию любой класс в делфи - потомок TObject, именно в нём реализована базовая работа с памятью
пыщь

Последний раз редактировалось JTG; 09.08.2009 в 02:40.
JTG вне форума Ответить с цитированием
Старый 09.08.2009, 14:11   #19
Sergey2
Форумчанин
 
Регистрация: 08.01.2008
Сообщений: 233
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
Вместо Hidden.test будет вызван Base.test, а Overrided.test отработает нормально.
Я, кстати, попробовал в этом примере убрать virtual и override - функция потомка не вызываться, т.е. всегда было Base Test. Кто то там раньше утверждал что все прекрасно перекрывается....
Может кто ссылку даст почитать какую-нить, а то я с этими наследованиями запутался.....

Что то я запутался... открыл свой проект. Убрал у предка virtual, у потомка override. И все работает. Вызывается метод потомка и отрабатывает....

Последний раз редактировалось Stilet; 10.08.2009 в 09:59.
Sergey2 вне форума Ответить с цитированием
Старый 09.08.2009, 18:02   #20
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Какой результат-то нужен? Код в студию
пыщь
JTG вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
что означает это сообщение? 54rus Помощь студентам 15 23.07.2009 18:05
Что означает маркировка кабеля Plenum Sjava Помощь студентам 1 22.05.2009 23:32
Что означает HWND_DESKTOP или Handle в функции MessageBox prikolist Общие вопросы C/C++ 5 18.03.2009 20:47
Подскажите пожалуйста, что означает строчка??? EDDY Паскаль, Turbo Pascal, PascalABC.NET 4 25.07.2008 16:32