![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов метода прапрародителя [D2005]
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