Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-98976
Calm
2002-12-10 10:17
2002.12.30
Почему не отображаются значения полей?


1-99180
race1
2002-12-19 06:48
2002.12.30
clipboard


6-99213
dimonf
2002-10-31 18:57
2002.12.30
Какой компанент использовать для работы на ниском уровне с SMTP.


1-99136
@andrew
2002-12-18 13:33
2002.12.30
ПРИВЕТ ВСЕМ! Можно ли как-то в режиме Run-Time определить


1-99069
Lizerginnn
2002-12-19 13:56
2002.12.30
Ado?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский