ObjectARX, AutoCAD. Среда программирования библиотеки C++

Идентификация Класса Во время выполнения


Каждый класс в ObjectARX иерархии, которая получена из AcRxObject, имеет соответствующий объект описателя класса, который является образцом AcRxClass, который держит информацию для идентификации типа во время выполнения. Объект описателя класса, gpDesc, является статическим компонентом данных класса — например, AcDbEllipse:: gpDesc. Объекты описателя Класса созданы при инициализации, когда классы зарегистрированы с ObjectARX и добавлены к словарю с  системным уровнем, acrxClassDictionary. Макрокоманды, описанные здесь облегчают объявление и выполнение некоторых функций, связанных с идентификацией во время выполнения и функциями инициализации. Они включают подпрограмму инициализации класса также как desc (), cast (), isKindOf (), и isA () функции для заказного класса.

Важные функции, обеспеченные AcRxObject классом для идентификации типа во время выполнения включают следующее:

·

desc (), статическая функция элемента, которая возвращает объект описателя класса частности (известный) класс.

·         cast (), статическая функция элемента, которая возвращает объект указанного типа, или NULL если объект не имеет требуемый класс (или полученный класс).

·         isKindOf () возвращается, принадлежит ли объект указанному классу (или полученный класс).

·         isA () возвращает объект описателя класса объекта, чей класс неизвестен.

Когда Вы хотите знать, каков классифицируют объект, использование AcRxObject:: isA (). Эта функция возвращает объект описателя класса (образец AcRxClass) для объекта базы данных. Его сигнатура

AcRxClass* isA() const;

Когда Вы уже знаете, каков классифицируют объект, Вы можете использовать desc () функция, чтобы получить объект описателя класса:

static AcRxClass* desc();

Следующий пример ищет образцы AcDbEllipse или любого класса, полученного из этого, используя isKindOf () и AcDbEllipse:: desc() статическая функция элемента:

AcDbEntity* curEntity = somehowGetAndOpenAnEntity();

                if (curEntity->isKindOf(AcDbEllipse::desc())) {

                               // Got some kind of AcDbEllipse instance.

                }

Этот пример показывает другому пути поиска образцов AcDbEllipse, или любого класса, полученного из этого, использование AcDbEllipse:: приведение () статическая функция элемента:

AcDbEllipse* ellipseEntity = AcDbEllipse::cast(curEntity);

if (ellipseEntity != NULL) {

                // Got some kind of AcDbEllipse instance.

}

Следующий пример ищет образцы AcDbEllipse, но не образцы классов, полученных из AcDbEllipse, используя isA () и AcDbEllipse:: desc ():

if (curEntity->isA() == AcDbEllipse::desc()) {

                // Got an AcDbEllipse, no more, no less.



Содержание раздела