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

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

Абстрактные виртуальные методы [D5, D6]


Страницы:   1 2 3 4

Ученик ©   (2002-08-28 13:21:00) 

Как определить, что абстрактный метод не реализован в наследнике ?


Ученик   (2002-08-28 14:35:00) [41]

>Сиарый паскалист (28.08.02 14:24)
А как вызывать IsMethodAbstract ?


Сиарый паскалист   (2002-08-28 14:24:00) [42]

Или так: (если без published методов)
...
TProc = procedure of object;
TTestAbsClass = class
procedure Test; virtual; abstract;
end;

var
AbstractMethodPointer: Pointer;

function IsMethodAbstract(Meth: TMethod): Boolean;

implementation

function IsMethodAbstract(Meth: TMethod): Boolean;
begin
Result := Meth.Code = AbstractMethodPointer;
end;

var
ob: TTestAbsClass;
p: TProc;

initialization

ob := TTestAbsClass.Create;
try
p := ob.Test;
AbstractMethodPointer := TMethod(p).Code;
finally
ob.Free;
end;

end.


Ученик   (2002-08-28 14:20:00) [43]

Для примера все работает, а в реале методы в public, сам конечно виноват, попробую искать адрес в VMT или переделаю в published


Ученик   (2002-08-28 14:15:00) [44]

>MBo © (28.08.02 14:07)
Большое спасибо, то что надо, пример я написал не очень удачный,
сразу не заработало, надо было TA = class(TComponent)


MBo   (2002-08-28 14:07:00) [45]

http://216.101.185.148/scripts/isapi.dll/article?id=6895378A&article=1575549


Сиарый паскалист   (2002-08-28 14:05:00) [46]

Ученик ©
Хотя вроде можно обойтись и без индекса - через TMethod.Code.
(Если просто брать @TSomeClass.AbstractMethod - он даст что-то другое (для неабстрактных методов обе величины совпадают)).


Skier   (2002-08-28 14:05:00) [47]

>Ученик
Извини, но...туманно.


Ученик   (2002-08-28 14:04:00) [48]

Skier © (28.08.02 13:59)
В двух словах, не все компоненты, работающие с базами данных поддерживают и таблицы и запросы, поэтому некоторые методы остаются нереализованными


Игорь Шевченко   (2002-08-28 14:04:00) [49]

Потому что, зная абстрактные методы предка, подразумевается, что их надо перекрывать для того, чтобы наследник корректно работал. Или не обращаться к ним.


Skier   (2002-08-28 13:59:00) [50]

>Ученик
Какая именно ?


Ученик   (2002-08-28 13:58:00) [51]

>Skier © (28.08.02 13:57)
Не, цель практическая, т.е. не спортивная


Skier   (2002-08-28 13:57:00) [52]

>Ученик


> Почему ?


А какая цель у всего этого ? Просто исследование ??


Ученик   (2002-08-28 13:57:00) [53]

>Сиарый паскалист (28.08.02 13:53)
Имеется ввиду индекс


Ученик   (2002-08-28 13:55:00) [54]

>Игорь Шевченко © (28.08.02 13:54)
Почему ?


Ученик   (2002-08-28 13:55:00) [55]

>Сиарый паскалист (28.08.02 13:53)
А как его узнать ?


Игорь Шевченко   (2002-08-28 13:54:00) [56]

Вопрос сам по себе некорректен, IMHO.


Сиарый паскалист   (2002-08-28 13:53:00) [57]

Копаясь в VMT, я заметил, что все абстрактные методы представлены в VMT одним и тем же указателем.
Соответственно, если знаешь индекс метода в VMT - то проверить на абстрактность элементарно.


Ученик   (2002-08-28 13:46:00) [58]

>Skier © (28.08.02 13:43)
Да, но решения пока нет


Skier   (2002-08-28 13:43:00) [59]

>Ученик
Имеешь ввиду VMT ?


Ученик   (2002-08-28 13:42:00) [60]

Skier © (28.08.02 13:36)
В данном случае это наверно не так, так как метод виртуальный


Страницы:   1 2 3 4

Наверх

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