Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.04.08;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.005 c
6-22785
mcp@online.ru
2002-01-25 00:04
2002.04.08
Как при поиске в компоненте TWebBrowser использовать собственную строку поиска?


1-22707
PEC
2002-03-26 12:24
2002.04.08
Привет народ


14-22829
Лёша
2002-02-22 15:43
2002.04.08
Посоветуйте хостинг.


1-22629
Дмитрий
2002-03-27 19:00
2002.04.08
COM&Outlook Express


1-22615
[HDD]John
2002-03-27 12:42
2002.04.08
Имитация нажатия кнопки.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский