考虑以下示例代码:
class Foo
{
};
class Bar : public Foo
{
};
class FooCollection
{
protected:
vector<shared_ptr<Foo> > d_foos;
};
class BarCollection : public FooCollection
{
public:
vector<shared_ptr<Bar> > &getBars()
{
// return d_foos won't do here...
}
};
我目前的项目中有这样的问题。客户端代码使用BarCollection
,它存储指向Bars
在d_foos
其中声明的指针FooCollection
。我现在想将指向 Bars 的指针集合公开给客户端代码。我可以让客户端代码访问指向Foo
s 的指针向量并将它们转换为Bar
客户端代码中指向 s 的指针,但这感觉不对,因为客户端不必知道Foo
' 的存在。
我还可以定义一个get()
成员来从中检索对象d_foos
并对其进行强制转换,但这感觉很笨拙。最好,我只想将 d_foos 作为 a 返回vector<shared_ptr<Bar> > &
,但我似乎无法做到这一点。
也可能是我的设计完全错误。不过,这似乎是最自然的解决方案,因为Bar
它是专业化的,Foo
并且BarCollection
是专业化的,FooCollection
并且它们共享功能。
您能否提出很好的解决方案来实施getBars
或BarCollection
更好的设计替代方案?
编辑:
原来我的设计确实很糟糕。BarCollection 不是 FooCollection,尽管它需要 FooCollection 的所有功能。我目前基于以下答案的解决方案 - 这更清洁 - 现在是:
class Foo
{
};
class Bar : public Foo
{
};
template<class T>
class Collection
{
vector<shared_ptr<T> > d_items;
};
typedef Collection<Foo> FooCollection;
class BarCollection : public Collection<Bar>
{
// Additional stuff here.
};
感谢所有优秀的建议和例子!