Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Метод класса в производном классе [D7, XP]


mfender ©   (2006-09-22 14:23:00) 

Здравия желаю!

У класса-предка есть метод. Он пустой. Пытался его объявить abstract, но компилятор заругался, сообщив, что он должен быть dynamicили virtual.

Так вот, в классе предке этот метод вызывается. Как добиться, чтобы он выполнялся объектом производного класса?

Короткая иллюстрация ко всему этому безобразию:


type
 TmfXMLTreeView = class(TCustomTreeView)
 FXMLTree: TXMLDocument;
 private
   procedure SetXMLTree(const Value: TXMLDocument);
   procedure FillTree(var XML: TXMLDocument); dynamic;
 end;

implementation

procedure TmfXMLTreeView.SetXMLTree(const Value: TXMLDocument);
begin
 FXMLTree := Value;
 FillTree(FXMLTree);
end;

procedure TmfXMLTreeView.FillTree(var XML: TXMLDocument);
begin

end;

----------------------------------------

type
 TmfCatalogXMLTreeView = class(TmfXMLTreeView)
 private
   procedure FillTree(var XML: TXMLDocument);
 published

 end;

implementation

procedure TmfCatalogXMLTreeView.FillTree(var XML: TXMLDocument);
begin
 showmessage('FILLED!');
end;


Сергей М.   (2006-09-22 16:36:00) [1]


> Очень мудрёно написано.


Чтой-то вдруг ?)

Цитируй справку, ссылайся на непонятное в ней, спрашивай ..

На то и форум ..


mfender   (2006-09-22 16:33:00) [2]


> Может таки хотя бы станд.справку почитать ?
> Там ведь четко обозначена разница между virtual и dinamic
> ..

Да читаю. Всё-равно не шибко понял. Очень мудрёно написано. Не дорос ещё...


Сергей М.   (2006-09-22 15:17:00) [3]


> mfender ©   (22.09.06 15:06) [9]
>
>


Может таки хотя бы станд.справку почитать ?
Там ведь четко обозначена разница между virtual и dinamic ..


Reindeer Moss Eater   (2006-09-22 15:15:00) [4]

Кстати.
Поосторожнее с параметром - TXMLDocument.
Он ведет себя по разному в зависимости от того, как создавался.
Иногда - это просто объект, иногда - чисто интерфейсный объект.


mfender   (2006-09-22 15:06:00) [5]


> Надеюсь, при этом разницу между виртуальными и динамическими
> методами ты осознаешь

Очень смутно. Как я понимаю, вся их разница где-то на уровне исполняемого кода...


Сергей М.   (2006-09-22 14:49:00) [6]


> mfender ©   (22.09.06 14:45) [7]


Надеюсь, при этом разницу между виртуальными и динамическими методами ты осознаешь


mfender   (2006-09-22 14:45:00) [7]


> Reindeer Moss Eater ©   (22.09.06 14:37) [5]
> Так он хочет вызывать метод не просто в предках, а в произвольном
> классе

Нет, так всё получилось:

 protected
   procedure FillTree(var XML: TXMLDocument); virtual; abstract;


mfender   (2006-09-22 14:39:00) [8]

Спасибо большое, ребята!
Действительно всё просто!

ЗЫ. А насчёт интерфейса - тоже подумаю... Надо и это постичь...


Reindeer Moss Eater   (2006-09-22 14:37:00) [9]

Так он хочет вызывать метод не просто в предках, а в произвольном классе


Сергей М.   (2006-09-22 14:36:00) [10]


> Пытался его объявить abstract, но компилятор заругался,
> сообщив, что он должен быть dynamic или virtu


Ну так и выполни требования компилятора !
В чем проблема-то ?)

type
TmfXMLTreeView = class(TCustomTreeView)
..
  procedure FillTree(var XML: TXMLDocument); dynamic; abstract;
..
end;

..
TmfCatalogXMLTreeView = class(TmfXMLTreeView)
..
  procedure FillTree(var XML: TXMLDocument); override;
..
end;

..
procedure TmfCatalogXMLTreeView.FillTree(var XML: TXMLDocument);
begin
..
end;

Ы ?


Ega23   (2006-09-22 14:36:00) [11]


> Убрать тело метода и объявить его как virtual; abstract;
>
>
> в производном объявить его как override;
>


и перенести его в секцию protected


Игорь Шевченко   (2006-09-22 14:33:00) [12]


> У класса-предка есть метод. Он пустой. Пытался его объявить
> abstract, но компилятор заругался, сообщив, что он должен
> быть dynamic или virtual.


Убрать тело метода и объявить его как virtual; abstract;

в производном объявить его как override;


Reindeer Moss Eater   (2006-09-22 14:30:00) [13]

Сделать интерфейс с таким методом.


Наверх

Титульная страница Поиск, карта сайта Написать письмо