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

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

Вызов метода прапрародителя [D2005]


Страницы:   1 2 3

pvr ©   (2008-02-28 10:39:00) 

Как это сделать?


pvr   (2008-02-28 12:38:00) [21]

Сергей М. ©   (28.02.08 12:34) [31]
Ты-то ведешь речь о методе объекта, при этом резонный вопрос возникает - метод Method какого конкретно объекта класса TGrandFather ты вызываешь строчкой "TGrandFather.Metod" ?

Там не было классовых методов вообще. Оператор TGrandFather.Metod вызывал метод экземпляра указанного типа (классов тоже не было, были объекты), при этом метод мог быть как статическим, так и виртуальным.


Сергей М.   (2008-02-28 12:34:00) [22]


> в Turbo Pascal вызов TGrandFather.Metod; работал как надо


Но это же и в TP не есть твой случай !

Ты-то ведешь речь о методе объекта, при этом резонный вопрос возникает - метод Method какого конкретно объекта класса TGrandFather ты вызываешь строчкой "TGrandFather.Metod" ?


pvr   (2008-02-28 12:29:00) [23]

Сергей М. ©   (28.02.08 12:24) [28]
Но в случае виртуального метода он, разумеется, неприменим.

Конечно, неприменим, Отсюда и вопрос.

Насчет "хорошего проектирования". Еще раз повторю, в Turbo Pascal вызов TGrandFather.Metod; работал как надо. И это считалось нормальным проектированием. Но в Delphi этой возможностью пожертвовали ради классовых методов, и проектирование стало плохим :-)


Alkid   (2008-02-28 12:29:00) [24]


> TGUIModalView, у меня все ходы записаны..  :)

Ага. Кстати, поступил я тогда по-свински. Надо было рефакторить :)


Сергей М.   (2008-02-28 12:24:00) [25]


> указанный вызов не катит


Зато замечательно катит приведение типа объекта к требуемому классу.
Но в случае виртуального метода он, разумеется, неприменим.


pvr   (2008-02-28 12:22:00) [26]

Alkid ©   (28.02.08 12:19) [25]
Ну вообще постановка задачи тут не фонтан, при хорошем проектировании таких ситуаций возникать не должно. В любом случае, лучше вынести нужный функционал в невиртуальную функцию, чем применять такие финты ушами.

Согласен.


pvr   (2008-02-28 12:20:00) [27]

Сергей М. ©   (28.02.08 12:16) [22]
TForm.InheritsFrom(TObject);

Это классовый метод. А у меня не классовый.


Alkid   (2008-02-28 12:19:00) [28]


> А это и есть грязный хак)
> Как и собственно постановка задачи.
> Потому и [18])

Ну вообще постановка задачи тут не фонтан, при хорошем проектировании таких ситуаций возникать не должно. В любом случае, лучше вынести нужный функционал в невиртуальную функцию, чем применять такие финты ушами.


Ega23   (2008-02-28 12:19:00) [29]


> Alkid ©   (28.02.08 10:54) [4]
> Если метод виртуальный, то тут сложнее. Я в своё время с
> ассемблером извращался.


TGUIModalView, у меня все ходы записаны..  :)


Сергей М.   (2008-02-28 12:17:00) [30]


> Alkid ©   (28.02.08 12:12) [21]


А это и есть грязный хак)
Как и собственно постановка задачи.
Потому и [18])


Сергей М.   (2008-02-28 12:16:00) [31]


> в Delphi ввели классовые методы, и указанный вызов не катит


Да ты что ?!

Вот чудеса-то !)

А у меня почему-то в Д7 "катит":

TForm.InheritsFrom(TObject);


На этой строчке компилятор не посылает меня лесом, значит с синтаксисомусе в порядке. А что при этом происходит в ран-тайм - это неважно, бо к синтаксису это не имеет ни малейшего отношения.

Синтаксис имеет отношение к дизайн-тайм, а не к ран-тайм)


> в семействе все в порядке


Все же позволю себе усомниться)


Alkid   (2008-02-28 12:12:00) [32]


> Сергей М. ©   (28.02.08 11:43) [14]

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


tesseract   (2008-02-28 12:07:00) [33]


> Если внуку что-то вдруг потребовалось из-под дедушки, значит
> не все ладно у них в семействе)


Припоминаю, прошлый раз кому-то такое на собеседовании задали.


pvr   (2008-02-28 12:05:00) [34]

Сергей М. ©   (28.02.08 11:55) [17]
При чем тут синтаксис - это так и осталось тайной за семью печатями)

В Turbo Pascal, начиная с версии 5.5 и заканчивая версией Borland Pascal 7.0 синтаксис позволял просто делать такой вызов

TGrandFather.Metod;

При этом звался статический или виртуальный метод - все равно.

А в Delphi ввели классовые методы, и указанный вызов не катит, т.к. у класса TGrandFather нет метода

class procedure TGrandFather.Metod; virtual;

Это и означает, что синтаксис не позволяет. А в семействе все в порядке :-)


Сергей М.   (2008-02-28 11:57:00) [35]


> pvr   (28.02.08 11:55) [16]


Если внуку что-то вдругпотребовалось из-под дедушки, значит не все ладно у них в семействе)


Сергей М.   (2008-02-28 11:55:00) [36]

При чем тут синтаксис - это так и осталось тайной за семью печатями)


pvr   (2008-02-28 11:55:00) [37]

Все же в моем случае удобнее завести дополнительный статический метод :-)


pvr   (2008-02-28 11:47:00) [38]

begin...end ©   (28.02.08 11:33) [13]

Спасибо.


Сергей М.   (2008-02-28 11:43:00) [39]

+ [13]

var
Obj: TGrandSon;
i: Integer;
Cls: TClass;
begin
Obj := TGrandSon.Create;
...

Cls := Obj.ClassType;
for i := 1 to 2 do
  Cls := Cls.ClassParent;

PPointer(Obj)^ := Cls;
try
  Obj.MyMethod
finally
  PPointer(Obj)^ := TGrandSon;
end;
...
end


begin...end   (2008-02-28 11:33:00) [40]

var
 Obj: TSon;
begin
 Obj := TSon.Create;
 ...
 PPointer(Obj)^ := TGrandFather;
 try
   Obj.MyMethod
 finally
   PPointer(Obj)^ := TSon
 end;
 ...
end


Страницы:   1 2 3

Наверх

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