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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов метода дедушки 
:(
    Опции темы
Delphist
Дата 8.9.2006, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



Есть код:

Код

type
  Object1 = class
     procedure Method1; virtual;
  end;
   Object2 = class(Object1)
      procedure Method1; override;
   end;
   Object3 = class(Object2)
      procedure Method1; override;
   end;

Как мне сделать так, чтобы в методе Method1 объекта Object3 выполнялся код из Method1 объекта Object1. inherited позволяет вызвать всего лишь код Method1 объекта Object2.

Это сообщение отредактировал(а) Delphist - 8.9.2006, 10:12


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
volvo877
Дата 8.9.2006, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 14
Всего: 116



Код
Object1(self).Method1;

попробуй...
PM MAIL   Вверх
Elfebet
Дата 8.9.2006, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 2
Всего: 14



Цитата

type    
  Object1 = class    
     procedure Method1; virtual;    
  end;    
   Object2 = class(Object1)    
      procedure Method1; override;    
   end;    
   Object3 = class(Object2)    
      procedure Method1; override;    
   end;

а зачем в Object1 Method1 стоит как virtual?


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
Snowy
Дата 8.9.2006, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Нет, с виртуальными методами это невозможно.
PM MAIL   Вверх
Rennigth
Дата 8.9.2006, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



тебе нужно вызывать  Method1->Object1 не вызывая  Method2->Object1?
или что? Сейчас в твоем случае Method1->Object3 вызовет Method1->Object2 а он Method1->Object1.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
volvo877
Дата 8.9.2006, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 14
Всего: 116



Цитата(Snowy @  8.9.2006,  10:19 Найти цитируемый пост)
с виртуальными методами это невозможно. 

 smile Интересное кино... FPC нормально вызывает метод "дедушки", Дельфи - не хочет...

Кстати, есть люди, утверждающие, что это возможно-таки... 

Код
procedure object3.Method1;
type PClass = ^TClass;
var
  ClassOld: TClass;

begin
  showmessage('obj3.method1');

  ClassOld := PClass(Self)^;
  PClass(Self)^ := Self.ClassParent.ClassParent;

  method1; // <-- Дедушка

  PClass(Self)^ := ClassOld;
end;


Это сообщение отредактировал(а) volvo877 - 8.9.2006, 10:47
PM MAIL   Вверх
Snowy
Дата 8.9.2006, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Дедушку вызвать можно. Но, только, если он не виртуальный.
Если дедушка виртуальный, то всегда будет вызываться через таблицу виртуальных методов.
Если не виртуальный, тогда вышеуказанный способ сработает.
PM MAIL   Вверх
volvo877
Дата 8.9.2006, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 14
Всего: 116



Snowy, я только что проверил предыдущий пост. Работает именно с виртуальными методами  smile 
PM MAIL   Вверх
Delphist
Дата 8.9.2006, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



Цитата(Rennigth @ 8.9.2006,  11:20)
тебе нужно вызывать  Method1->Object1 не вызывая  Method2->Object1?

Да.

Добавлено @ 10:55 
Цитата(Elfebet @ 8.9.2006,  11:18)
Цитата

type    
  Object1 = class    
     procedure Method1; virtual;    
  end;    
   Object2 = class(Object1)    
      procedure Method1; override;    
   end;    
   Object3 = class(Object2)    
      procedure Method1; override;    
   end;

а зачем в Object1 Method1 стоит как virtual?

таким образом делается переопределение метода.


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Snowy
Дата 8.9.2006, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



volvo877, я писал пост до редактирования предыдущего.
Он относится к коду второго поста.
Что касается кода с подменой класса...
Да, для виртуального метода единственный способ вызвать метод дедушки - это стать дедушкой.
Но... Честно говоря, лучше грамотно спроектировать иерархию, чем лезть во внутренние дела механизма.

Добавлено @ 11:03 
Цитата(Delphist @  8.9.2006,  10:55 Найти цитируемый пост)
таким образом делается переопределение метода.
Нет. virtual предназначено совсем для другого.
Переназначить можно и невиртуальный метод.
PM MAIL   Вверх
Delphist
Дата 8.9.2006, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



Цитата(Snowy @ 8.9.2006,  12:02)
Переназначить можно и невиртуальный метод.

Каким образом?


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Snowy
Дата 8.9.2006, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Банально:
Код

  Object1 = class
     procedure Method1;
  end;
   Object2 = class(Object1)
      procedure Method1;
   end;
   Object3 = class(Object2)
      procedure Method1;
   end;


Добавлено @ 12:20 
inherited здесь работает. Только вызов метода будет зависеть от того, в контексте какого класса он вызван.

Добавлено @ 12:23 
Например:
Код

var
  o: Object1;
begin
  o := Object3.Create;
  o.Method1; // если виртуальный - вызов свой, если нет - вызов деда
  Object2(o).Method1; // если виртуальный - вызов свой, если нет - вызов Object'a 2
  Object3(o).Method1; // вызов свой
  Object1(o).Method1; // если не виртуальный, то вызов деда, независимо от типа o
end;


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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