我正在编写Unicode代码点的通用列表。问题是我也想要一些允许专门版本的通用类设计。这是一个例子。
这是一个例子。
class
MyString
{
public:
auto getItemAt(int index) const -> UnicodePoint const;
auto subsetInRange(int index, int length) const -> MyString const;
auto getUTF8Binary() const -> std::string const;
};
这里只有一个,但实际上,有很多方法,如subsetInRange
,所以我不想重复为其他数据类型编写它们。这导致我编写了一个通用版本的超类。
template<typename T, typename FINAL_SELF_TYPE>
class
MyList
{
public:
auto getItemAt(int index) const -> T const;
auto subsetInRange(int index, int length) const -> FINAL_SELF_TYPE const;
// getUTF8Binary() removed because it's inappropriate on this abstraction level.
};
class
MyString : public MyList<UnicodePoint, MyString>
{
public:
auto getUTF8Binary() const -> std::string const;
};
最后,我不得不承认我必须将最终类类型作为模板参数传递给MyList
类,以使其正常工作。它感觉有些不对劲。我不能说它究竟是什么,但我的大脑不断发出警告信号。我认为这是因为我在抽象的普通班上提供了一些专业化信息。这似乎是循环依赖 - 在任何情况下都不好。它完全反对类层次结构。
但是当我写一些通用类时,方法返回相同类型的结果,我总是看到这种模式。这让我烦恼。由于我的C ++经验很短,我对自己的设计没有信心。
这种模式对你有什么影响?好还是错?如果这是错的,那有什么不对?