Классы #3

bdr>  Прочитал твои два послания. Спасибо за информацию.
bdr>  У меня к тебе два вопроса, если есть время.
bdr>  1. Чем все таки лучше и правильно ли использовать
bdr>  Init       PROCEDURE(*GROUP _objB)
bdr>   или как приводил Андрей передавать адрес класса в STRING
bdr>   и почему неиспользовать
bdr>   Init       PROCEDURE(ClassB _objB)

Как внес поправку Андрей — передавать адрес через строку удобнее при запуске нового потока. Так как только строки возможно передавать в качестве параметров. При обычном вызове — лучше передавать через группу, т.к. — это «родной» формат для класса. Использовать в качестве параметра класс — тоже правильно. Другое дело, что при таком описании ты не сможешь в эту процедуру передать другой класс. А при передаче через строку или группу можно передавать любые классы.

bdr>  2.Второй вопрос несколько на другую тему, но о классах
bdr>  Описаны 3 типа класса: класс А; и В и С порожденные от А
bdr>  В некую процедуру(это может быть и метод вообще другого класса)
bdr>  в качестве параметра передаются класс типа В или С
bdr>   ( Procedure(ClassA CurrentClass)). Как в этой процедуре определить
bdr>  что передан класс типа В или класс типа С, неспользуя дополнительных
bdr> параметров.  В DELPHY для этого есть AS.

Два способа:

я иногда завожу в классах строковую переменную, в которую при инициализации записываю название типа класса.

если оба класса различаются по общему размеру свойств, то можно сравнивать размер переданного класса.

Есть, правда, еще один способ. Посложнее. Класс передается в процедуру по адресу его буфера. Первым лонгом в этом буфере идет адрес таблицы виртуальных методов. Вот уже он — разный для разных классов. Он назначается на этапе компиляции. Так что, в принципе, в начале программы можно составить некую таблицу этих адресов VMT для разных классов и уже по ней идентифицировать классы. Кстати, если у класса нет виртуальных методов или вообще нет методов — все равно этот параметр есть. Он используется RTL-библиотекой для получения полной инфы о структуре класса. Эта инфа записана непосредственно ПЕРЕД тем адресом, на который указывает адрес VMT.