假设我有一个较低级别的类层次结构
class A {...};
class A0 : public A {...};
class A1 : public A {...};
class A2 : public A {...};
我想用更高级别来表示它,比如带图标的GUI级别,在这些类中添加虚拟方法可能很容易
virtual Icon A::icon() {return iconOfA;}
virtual Icon A0::icon() {return iconOfA0;}
virtual Icon A1::icon() {return iconOfA1;}
virtual Icon A2::icon() {return iconOfA2;}
但是,我不想改变低级别的类,实现它的任何简单方法?我希望动态使用它,比如
A* a = new A2();
getIcon(a); // will return iconOfA2.
感谢。
答案 0 :(得分:5)
在GUI级别创建一个地图,该地图将包含键的键和值的图标。 Icon属于GUI,它可能与类本身无关。
答案 1 :(得分:3)
Icon getIcon(A* a_ptr){
A0* a0_ptr = dynamic_cast<A0*>(a_ptr);
if(a0_ptr){
return iconOfA0;
}
A1* a1_ptr = dynamic_cast<A1*>(a_ptr);
if(a1_ptr){
return iconOfA1;
}
A2* a2_ptr = dynamic_cast<A2*>(a_ptr);
if(a2_ptr){
return iconOfA2;
}
return Icon();
}
或者声明地图:
typedef std::map<const type_info*, Icon> Iconmap;
Iconmap iconmap;
//...
iconmap.insert(std::make_pair(&typeid(A0), Icon()));
iconmap.insert(std::make_pair(&typeid(A1), Icon()));
iconmap.insert(std::make_pair(&typeid(A2), Icon()));
//...
并根据RTTI返回图标:
Icon getIcon(A* ptr){
Iconmap::iterator it = iconmap.find(&typeid(*ptr));
if(it!=iconmap.end()){
return (*it).second();
}else{
return Icon();
}
}
答案 2 :(得分:1)
使用RTTI:
if (typeid(*a).name()==typeid(A0).name()) return iconOfA0; else if
(typeid(......
答案 3 :(得分:0)
执行此操作的一种方法是在基类A中包含一个Icon数据字段。这应该是公共的或受保护的,以便在派生类中可以访问它。然后,每个类的构造函数可以将值设置为它们自己的图标版本。 getIcon方法将始终为玻璃返回正确类型的Icon,并且只需在基类中定义方法。