Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.08;
Скачать: CL | DM;

Вниз

Как проверить имеет ли порожденный объект переопределенный метод?   Найти похожие ветки 

 
Kirill_Other   (2002-03-26 09:51) [0]

Ситуация - Есть базовый абстрактный объект, и в нем определены некоторые абстрактные методы. Потом порождается от него другой объект и в нем некоторые методы переопределяются а некоторые нет(тоесть они остаются абстрактными). И вот мне надо узнать из приложения какие методы переопределены а какие нет.
Пробовал проверять адресс метода на nil но что-то не очень получается.


 
MBo ©   (2002-03-26 09:56) [1]

[Warning] Unit1.pas(31): Constructing instance of "TStrings" containing abstract methods
это не спасает?


 
Kirill_Other   (2002-03-26 10:16) [2]

Что-то я не совсем понял Вашу мысль. Если можно поподробней.


 
Виктор Щербаков ©   (2002-03-26 10:21) [3]

Ну типа компилятор сам о них предупреждает.


 
Kirill_Other   (2002-03-26 10:31) [4]

Это очень хорошо, что компилятор сам о них предупреждает, но у меня в прогремме некоторые кнопки реагируют на эти абстрактные методы и в зависимости с каким порожденным объектом она работает надо смотреть есть ли переопределенные методы и если нету то соответствующую кнопку надо спрятать. Меня интересует как это сделать программно. В абстрактном оъекте определить методы как dynamic abstract а потом проверять на nil что-ли?


 
reonid ©   (2002-03-26 11:43) [5]

Насколько я помню, у всех абстрактных методов
TMethod(AbstrMethod).Code указывает на один и тот же адрес,
независимо от аргументов метода.

(Я не помню, есть ли где-нибудь на него официальная ссылка, но его всегда можно взять у заведомо абстрактного метода)


 
yaJohn ©   (2002-03-26 12:18) [6]

ИМХО в данном случае будет корректно
try
MyObj.MyMetod;
except
//HideButton....
end;

>TMethod(AbstrMethod).Code указывает на один и тот же адрес
Вызывающий Exception вызова абстрактного метода.


 
reonid ©   (2002-03-26 12:36) [7]

>yaJohn ©
При использовании твоей идеи если метод не абстрактный,
то он будет выполнен, что ИМХО неправильно.

Правильнее проверить адрес метода (без его вызова).


 
yaJohn ©   (2002-03-26 12:50) [8]

2 reonid
А я не сказал что это правильно. Я сказал, что это корректно.
Правильно будет не оставлять абстрактных методов, а вешать на них в потомках заглушки, по которым можно все красиво проверить, поскольку их адреса уж точно известны. IMHO


 
reonid ©   (2002-03-26 13:42) [9]

По адресам заглушек никак не проверишь, поддерживается этот метод или нет.

Если делать заглушки, то возможен следующий подход:

ESuppported = class(EAbort) end;
ENotSuppported = class(EAbort) end;

var
SupportTestMode: Boolean = False;

procedure Support(MethodSupported: Boolean);
begin
if SupportTestMode then if MethodSupported then
raise ESupport.Create else raise ENotSupport.Create;
end;

В НАЧАЛЕ каждого методе вызывать Support(True) или
Support(False) (False - для заглушек)
В режиме тестирования это предотвратит выполнение основного тела метода.

и соответственно проверка, поддерживается ли данный метод

function Supported(Meth: TNotifyEvent{для примера});
begin
SupportTestMode := True;// Включён режим проверки
try
try
Meth(nil); // значимый код метода НЕ будет выполнен
// сюда не должны попасть
raise Exception.Create("В методе забыли вызвать Support");
except
on ESupported do Result := True;
on ENotSupported do Result := False;
end;
finally
SupportTestMode := False;
end;
end;



Страницы: 1 вся ветка

Текущий архив: 2002.04.08;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
14-22836
BJValentine
2002-02-13 22:29
2002.04.08
Почта


1-22687
shane54
2002-03-26 13:45
2002.04.08
При обработки нажатия на Enter...


14-22816
QueenOfRain
2002-02-26 10:51
2002.04.08
Трепаться, так и об этом тоже....


1-22655
DikobraZ
2002-03-26 12:00
2002.04.08
User32.dll:SetLayeredWindowAttributes.


14-22813
С_тоша
2002-02-26 18:10
2002.04.08
HELP!!!!!!!!