我有一个存储“Item”类型的库存系统,它是一个抽象类。我有一个名为“Skates”的派生类。该程序允许用户将“Skates”添加到“Item”指针的向量中。用户输入冰鞋的模型和ID,我创建一个“Skates”对象,并将这些作为参数。然后我使用“Item”指针指向“Skates”对象并将其添加到向量中。当用户想要编辑“Skates”对象时,我必须将其dynamic_cast回“Skates”对象,然后进行编辑。
std::vector<Item*> ItemCollection;
Item * item = new Skates("model1", 1);
ItemCollection.push_back(item);
//To retrieve it
Skates * skatesToEdit = dynamic_cast<Skates*>(ItemCollection[0]);
我现在面临的问题是考虑一个新的派生类,例如“Skateboard”类。我不想创建一个新方法来处理“Skateboard”类的编辑,如:
Skateboard * skateboardToEdit = dynamic_cast<Skateboard*>(ItemCollection[0]);
因为这意味着每次我创建一个新的派生类时,我都需要每次都编写相同类型的代码。所以我想知道是否有一种方法可以使应用程序动态地知道它是什么派生类,而无需我指定它。所以它需要能够确定数据类型,然后提示用户在一个动态方法中编辑它具有的任何属性(因为目标是用户首先编辑对象),我认为这是不可能的。
答案 0 :(得分:1)
我建议也许继承不是你需要的。而不是像Skates,Skateboard这样的类,考虑只使用类Item,它是表示属性的键值的集合。这样您就不会真正关心项目的类,您可以动态地列出和编辑属性。
答案 1 :(得分:0)
据我了解,您有编辑衍生商品的方法,例如void editSkates(Skates*)
,void editSkateboard(Skateboard*)
等。
然后您可以申请Visitor pattern。使用Visitor
方法创建抽象visit
类,为每个不同的Item
子类重载:
class ItemVisitor{
public:
virtual void visit(Skates*) = 0;
virtual void visit(Skateboard*) = 0;
//... one function for every subclass
};
在virtual void accept(ItemVisitor&) = 0;
课程中创建Item
方法。在每个子类中,比如Skates
,覆盖此方法以调用正确的visit
:
void Skates::accept(ItemVisitor& visitor){
visitor.visit(this);
}
现在,您可以继承ItemVisitor
来执行特定子类的特定事务,如下所示:
class EditVisitor: public ItemVisitor{
public:
virtual void visit(Skates* skates){
skates->editSpecialSkatesProperty();
}
virtual void visit(Skateboard* skateboard){
skateboard->editSpecialSkateboardProperty();
}
};
最后使用您的通用Item * item
实例执行此特定操作:
EditVisitor edit;
item->accept(edit);