我有一个类,它将std::vector适配成特定领域对象的容器。我想向用户公开大部分std::vector API,以便他们可以使用熟悉的方法(size,clear,at等)和标准算法在容器上操作。这似乎是我设计中经常出现的一种模式:
class MyContainer : public std::vector<MyObject>
{
public:
// Redeclare all container traits: value_type, iterator, etc...
// Domain-specific constructors
// (more useful to the user than std::vector ones...)
// Add a few domain-specific helper methods...
// Perhaps modify or hide a few methods (domain-related)
};
我知道在重用类进行实现时,倾向于使用组合而非继承的做法,但肯定有一个限度!如果我将所有东西委派给std::vector,那么将会有(根据我的计算)32个转发函数!
所以我的问题是...在这种情况下继承实现真的很糟糕吗?有哪些风险?是否有更安全的实现方式可以少打这么多代码?我使用实现继承是异端吗? :)
编辑:
那么,明确一下用户不应该通过std::vector指针来使用MyContainer怎么样:
// non_api_header_file.h
namespace detail
{
typedef std::vector<MyObject> MyObjectBase;
}
// api_header_file.h
class MyContainer : public detail::MyObjectBase
{
// ...
};
Boost库似乎总是这样处理。
编辑2:
其中一种建议是使用自由函数。我将在此处展示伪代码:
typedef std::vector<MyObject> MyCollection;
void specialCollectionInitializer(MyCollection& c, arguments...);
result specialCollectionFunction(const MyCollection& c);
etc...
更符合面向对象风格的做法:
typedef std::vector<MyObject> MyCollection;
class MyCollectionWrapper
{
public:
// Constructor
MyCollectionWrapper(arguments...) {construct coll_}
// Access collection directly
MyCollection& collection() {return coll_;}
const MyCollection& collection() const {return coll_;}
// Special domain-related methods
result mySpecialMethod(arguments...);
private:
MyCollection coll_;
// Other domain-specific member variables used
// in conjunction with the collection.
}