![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Абстрактные виртуальные методы [D5, D6]
Ученик © (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)
В данном случае это наверно не так, так как метод виртуальный