2010-10-09 4 views

ответ

2

Перегрузка: я не думаю, что для этого есть флаг RTTI, но вы можете проверить, существует ли более одного метода с тем же именем. Это не идеально, но это, вероятно, так близко, как вы собираетесь.

Переопределение: сначала убедитесь, что метод является виртуальным. (Или динамическая или отправка сообщений.) Затем проверьте предков класса для других методов с тем же именем и свойством VirtualIndex.

Резюме: Глубоко в реализации секции rtti.pas, в с кучей флагов данных методов, одна называется mfAbstract, определяется как 1 shl 7;. Нет кода, который ссылается на это, но он реализован в RTTI, сгенерированном компилятором. Если у вас есть ссылки TRttiMethod для метода, вы можете проверить это следующим образом:

IsVirtual := PVmtMethodExEntry(method.Handle).Flags and (1 shl 7) <> 0; 

PVmtMethodExEntry объявлен в TypInfo блоке, так что вы должны будете использовать его для того, чтобы работать.

+0

О перегрузке: максимальное количество опубликованных перегруженных методов равно 1, поэтому поиск одного и того же имени не будет работать, не так ли? – NGLN