template <class CollectionItem>
class Collection
{
void A();
// Many other utility functions
}
class ICollection
{
virtual void B() = 0;
}
class Base : public Collection<BaseItem>, public IBase
{
virtual void B();
}
有没有办法Collection
通过ICollection
接口提供功能而不将所有功能包装在Base
类中?ICollection : public Collection<CollectionItem>
不是一种选择。
赏金更新:好的,所以最初的想法是为所有 Collection 类提供接口。在我们继续之前,everyCollectionItem
也有接口,我们称之为它ICollectionItem
并且ICollection
只知道ICollectionItem
.
所以我所做的就是创建另一个模板类作为 Collection 模板类的 Interface - ICollection
(pure virtual) accepting ICollectionItem(s)
。Collection 类继承了这个接口。
每个Collection
类(继承Collection<CollectionItem>
类)也将继承它的接口Collection
类。该接口然后 virtual 继承ICollection<ICollectionItem>
。我只是发布代码:)
这是代码:
template <class ICollectionItem>
class ICollection
{
public:
virtual const ICollectionItem* At(const int idx) = 0;
};
template <class CollectionItem, class ICollectionItem>
class Collection
: public ICollection,
public virtual ICollection<ICollectionItem> // Weak point
{
private:
List<CollectionItem*> fContainer;
public:
Collection(void) {}
virtual ~Collection() {}
virtual const ICollectionItem* At(const int idx); // Casting GetAt result
virtual const TCollectionItem& GetAt(const int idx) const
virtual ListIterator<TCollectionItem> >* GetIterator(void) const;
virtual ListIterator<ICollectionItem> >* Iterator(void) const; // Weak point
}
示例用法:
class IBaseItem
{
public:
virtual int Number() = 0;
{
class BaseItem
: public IBaseItem
{
public:
virtual int Number();
void SetNumber(int value);
}
class IBase
: public virtual ICollection<IBaseItem>
{
public:
virtual IBaseItem* ItemByName(String name) = 0;
virtual ~IBase() {}
}
class Base
: public Collection<BaseItem, IBaseItem>,
public IBase
{
public:
BaseItem* GetItemByName(String name);
virtual IBaseItem* ItemByName(String name);
}
弱点:
Iterator
使用ICollection
界面访问。查看ListIterator
功能,只能实现第一个,第二个需要某种新的 List IBaseItem
。我决定接受它,只使用 for 循环。
即使我以某种方式设法得到了我想要的东西(通过包装和铸造),我仍然想听听第二个意见。我不喜欢使用虚拟继承,特别是在这种微妙的情况下——使用 Collections 来创建应用程序 Base。