下面是一个工作示例。这里的想法是获取所有这些 if/else/isKindOf 的东西,并将它们放入一个函数中,然后调用适当的重载函数。 这样,原始例程的核心逻辑将保持清晰简洁,同时仍能获得函数重载的好处。
- #include "StdAfx.h"
- Acad::ErrorStatus Function(const AcDbEntity *& pEnt)
- {
- acutPrintf(_T("\nCatch all for AcDbEntity types called. The entity is a %s"), pEnt->isA()->name());
- return Acad::eNotImplementedYet;
- }
- Acad::ErrorStatus Function(const AcDbLine *& pEnt)
- {
- acutPrintf(_T("\nAcDbLine function called."));
- return eOk;
- }
- Acad::ErrorStatus Function(const AcDbCircle *& pEnt)
- {
- acutPrintf(_T("\nAcDbCircle function called."));
- return eOk;
- }
- /*
- * The purpose of the function is to take an entity
- * derived from AcDbEntity, determine its type and
- * call the correct Function above.
- * kind of like a traffic cop, directing traffic.
- * Probably not the best function name in the world, but...
- */
- Acad::ErrorStatus FunctionRouter(const AcDbEntity *& pEnt)
- {
- if(pEnt->isKindOf(AcDbLine::desc()))
- return Function((const AcDbLine *&) pEnt);
- else if(pEnt->isKindOf(AcDbCircle::desc()))
- return Function((const AcDbCircle *&) pEnt);
- else if(pEnt->isKindOf(AcDbEntity::desc()))
- return Function((const AcDbEntity *&) pEnt);
- return eWrongObjectType;
- }
- void TestFunctionRouter(void)
- {
- AcDbDatabase * pDb = acdbHostApplicationServices()->workingDatabase();
- AcDbBlockTableRecord * pRec;
- if(acdbOpenAcDbObject((AcDbObject *&) pRec, pDb->currentSpaceId(), AcDb::kForRead) == Acad::eOk) {
- AcDbBlockTableRecordIterator * pIter = NULL;
- if(pRec->newIterator(pIter) == Acad::eOk) {
- for(pIter->start(); !pIter->done(); pIter->step()) {
- AcDbEntity * pEnt = NULL;
- if(pIter->getEntity(pEnt, AcDb::kForRead) == Acad::eOk) {
- Acad::ErrorStatus es;
- // look ma', no ugly if/else if/else if/else junk in my routine
- es = FunctionRouter((const AcDbEntity *&)pEnt);
- pEnt->close();
- }
- }
- delete pIter;
- }
- pRec->close();
- }
- }
|