我有一个通用项列表类来创建一个更具体的列表,使用它作为基类,就像这样..
ref class ItemBase { }
ref class ItemA : ItemBase { }
ref class ItemList abstract {
public:
virtual void add(ItemBase ^p);
}
ref class ItemListA : ItemList {
public:
virtual void add(ItemA ^p) override; // it doesn't works :(
}
我想限制在每个类中添加特定类型的项目。
答案 0 :(得分:2)
执行此操作的可接受模式是制作基类方法protected
:
ref class ItemBase { }
ref class ItemA : ItemBase { }
ref class ItemList abstract {
protected:
virtual void addInternal(ItemBase ^p);
}
ref class ItemListA : ItemList {
public:
virtual void add(ItemA ^p){addInternal(p);}
}
这是使用泛型的更好解决方案。请注意我们如何将通用参数T
约束为ItemBase
,以强制此集合只能与ItemBase
或其子类一起使用。
ref class ItemBase { };
ref class ItemA : public ItemBase { };
generic <class T>
where T: ItemBase
ref class ItemList abstract {
public:
virtual void Add(T p){}
};
ref class ItemListA : ItemList<ItemA^> {
//no need to override Add here
};
//usage
int main(array<System::String ^> ^args)
{
ItemListA^ list = gcnew ItemListA();
list->Add(gcnew ItemA());
}