Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов методов предков, Вопрос по объектному ориентированию... 
:(
    Опции темы
Vit
Дата 30.9.2002, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

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



1) Есть Class1, с методом Mtd.
2) Eсть Class2 наследованный от Class1, метод Mtd перезаписан
3) В программе используется переменная типа Class2

Можно ли из программы вызвать Mtd от Class1, Другими словами, можно ли вызвать перезаписанный метод класса-предка?


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Fantasist
Дата 30.9.2002, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



У меня всегда получалось это прямым преобразованием:

var
a:class2;

begin
a:=class2.Create;
class1(a).mtd;
....
end;


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Vit
Дата 30.9.2002, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

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



Не хочет, вызывает метод текущего класса... Или я криво тестировал?


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Vit
Дата 30.9.2002, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

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



Вот мой тестовый код:

Код

Type TClass1=class(Tobject)
 public
   procedure mtd; virtual;
 end;

Type TClass2=class(TClass1)
 public
   procedure mtd;override;
 end;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
 var c:TClass2;
begin
 c:=TClass2.create;
 TClass1(c).mtd;
 c.free;
end;

{ Class1 }

procedure TClass1.mtd;
begin
 Showmessage('Class1.mtd')
end;

{ Class2 }

procedure TClass2.mtd;
begin
 Showmessage('Class2.mtd')
end;



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Le Taon
Дата 30.9.2002, 20:42 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Способ со статическим приведением годится только для
невиртуальных методов, имеющих одно имя.

Вызов же виртуальных методов от статического типа не зависит.
В твоём простейшем случае достаточно написать inherited Mtd;
(ты его можешь вызвать из любого метода TClass2, не только из Mtd).

Трудности возникнут, когда нужно вызвать метод "дедушки" или "прадедушки" и т.д.
Один из способов, описанных в литературе, - временная замена
VMT объекта на "дедушку" и обратно. Но если у дедушки такого метода не было - будет облом.

Я предпочитаю такой способ:

type
 TProc = procedure of object;

procedure TClassN.SomeMethod;
var
 Proc: TProc;
begin
 TMethod(Proc).Code := @TClass1.Mtd; // Статический адрес
 TMethod(Proc).Data := Self;
 Proc();
end;
  Вверх
Le Taon
Дата 30.9.2002, 20:45 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Прошу прощения, ты вызываешь Mtd предка не из метода потомка, поэтому inherited не пройдёт.

Но способ со взятием статического адреса метода сработает.
  Вверх
Vit
Дата 1.10.2002, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

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



Спасибо!


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Fantasist
Дата 1.10.2002, 03:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Блин, а что же ты не написал, что он у тебя виртуальный? Я подумал что перезаписан это в смысле статически перекрыт. С виртуальным методом действительно статическое преобразование к такому результату не приведет, так как адрес метода все равно будет взят из vtable.
Взятие статического адреса, конечно, выход, но мне почему-то все время думается, нафиг мы тогда вообще полиморфизм придумали? По идее ООП разработка должна быть такая, чтобы классы было удобно исрользовать, а не прибегать к таким трюкам.


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


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

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



Цитата
Блин, а что же ты не написал, что он у тебя виртуальный?


По недоумию...

Цитата
По идее ООП разработка должна быть такая, чтобы классы было удобно исрользовать, а не прибегать к таким трюкам.


Она и есть на 99.9% такая, но любые ограничения накладываемые любой технологией могут мешать разрботке каких-то специфичных вещей... Возникновение языков высокого уровня избавило от необходимости писать тысячи строк кода для элементарных действий, но ассемблер до сих пор находит применение в отдельных случаях, без него никак. Возникновение визуального программирования избавило от трудоёмкого и нудного "расставляния" компонентов в коде, но во многих случаях все иногда создают компоненты в run-time. То же самое и с объектными технологиями, да -  они решили много проблем и сделали написание кода намного удобнее, но тем не менее есть и будут случаи, когда они должны быть использованы действия, идущие в разрез с идеологией. Так было и так всегда будет для всех технологий...


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

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


 




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


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

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