Форум: "Основная";
Текущий архив: 2002.12.30;
Скачать: [xml.tar.bz2];
ВнизВызов метода Найти похожие ветки
← →
Vladimir_Shk (2002-12-18 18:44) [0]Здравствуйте! Три объекта наследуемые один от другого. Скажем
class TOb1 (TObject);
class TOb2 (TOb1);
class TOb3 (TOb2);
В классе TOb1 есть виртуальный метод, который переопределяется в потомках. Ob2.Method выполняет какой-то код, затем вызывает inherited. Все просто.
А вот в Ob3 мне нужно выполнить какой-то код, а потом вызвать метод предка Ob1, пропустив метод Ob2.
Как это можно сделать?
← →
Хрюккиннен (2002-12-18 18:58) [1]Можно (Ob3 as TOb1).Method;
А можно TOb1(Ob3).Method;
← →
Хрюккиннен (2002-12-18 19:01) [2]Вернее, (Self as TOb1).Method, ежли ты пишешь внутри объектного метода
← →
Skier (2002-12-18 19:11) [3]Примерно так...
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;
← →
Skier (2002-12-18 19:15) [4]>Vladimir_Shk
Степень приближения к "аксакалу" (твоему корневому классу)
зависит от количества вызовов метода ClassParent
В твоём случае их два...
← →
oomneeq (2002-12-18 19:49) [5]2 Хрюккиннен
приведение
TOb1(Ob3).Method равно как и (Self as TOb1).Method
не сыграет никакого рояля!
можно ставить приведение к любому типу (есессно, имеющему метод Method) все равно будет вызван TObj3.Method.
матчасть, однако.. VMT и все такое ...
Ты б проверял свои догадки прежде чем людЯм советовать.
← →
Хрюккиннен (2002-12-18 20:16) [6]И то правда... Обманулся. Сорри.
← →
down (2002-12-18 20:25) [7]type
TObMethod = procedure(Self: TObject);
procedure TOb3.SomeMethod;
var
ObMethod: TObMethod;
begin
ObMethod := @TOb1.Method;
ObMethod(Self);
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.30;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c