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

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

Вызов метода [D5, Win2k]


Vladimir_Shk ©   (2002-12-18 18:44:00) 

Здравствуйте! Три объекта наследуемые один от другого. Скажем
class TOb1 (TObject);
class TOb2 (TOb1);
class TOb3 (TOb2);

В классе TOb1 есть виртуальный метод, который переопределяется в потомках. Ob2.Method выполняет какой-то код, затем вызывает inherited. Все просто.

А вот в Ob3 мне нужно выполнить какой-то код, а потом вызвать метод предка Ob1, пропустив метод Ob2.

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


down   (2002-12-18 20:25:00) [1]

type
TObMethod = procedure(Self: TObject);
procedure TOb3.SomeMethod;
var
ObMethod: TObMethod;
begin
ObMethod := @TOb1.Method;
ObMethod(Self);
end;


Хрюккиннен   (2002-12-18 20:16:00) [2]

И то правда... Обманулся. Сорри.


oomneeq   (2002-12-18 19:49:00) [3]

2 Хрюккиннен

приведение
TOb1(Ob3).Method равно как и (Self as TOb1).Method
не сыграет никакого рояля!

можно ставить приведение к любому типу (есессно, имеющему метод Method) все равно будет вызван TObj3.Method.

матчасть, однако.. VMT и все такое ...

Ты б проверял свои догадки прежде чем людЯм советовать.





Skier   (2002-12-18 19:15:00) [4]

>Vladimir_Shk
Степень приближения к "аксакалу" (твоему корневому классу)
зависит от количества вызовов метода ClassParent
В твоём случае их два...


Skier   (2002-12-18 19:11:00) [5]

Примерно так...

TOb1 = class
public
procedure SomeMethod; virtual;
end;

TOb2 = class(TOb1)
public
procedure SomeMethod; override;
end;

TOb3 = class(TOb2)
public
procedure SomeMethod; override;
end;

//...........

{ TOb1 }

procedure TOb1.SomeMethod;
begin
ShowMessage("TOb1.SomeMethod");
end;

{ TOb2 }

procedure TOb2.SomeMethod;
begin
ShowMessage("TOb2.SomeMethod");
inherited;
end;

{ TOb3 }

procedure TOb3.SomeMethod;
type
PClass = ^TClass;
var
AOldClass : TClass;
begin
ShowMessage("TOb3.SomeMethod");
AOldClass := PClass(Self)^;
PClass(Self)^ := Self.ClassParent.ClassParent;
SomeMethod;
PClass(Self)^ := AOldClass;
end;


Хрюккиннен   (2002-12-18 19:01:00) [6]

Вернее, (Self as TOb1).Method, ежли ты пишешь внутри объектного метода


Хрюккиннен   (2002-12-18 18:58:00) [7]

Можно (Ob3 as TOb1).Method;
А можно TOb1(Ob3).Method;


Наверх

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