c++ - 这是 "recognised"OO 模式吗?需要健全性检查!

标签 c++ design-patterns oop

如果我想扩展一系列我无法更改的对象的功能 - 例如添加格式,并且不想派生大量的类来扩展功能 - 以下内容会被认为是不好的吗? (我以 int 和 float 为例,但在我的程序中,我有大约 20 或 30 个类最终会出现在包含泛型类型的树中)。

class ITreeNode
{
public:
 virtual ~ITreeNode() {}
 virtual void print() = 0;
};

template <class T>
class ObjectNode : public virtual ITreeNode
{
public:
 virtual ~ObjectNode() {}
 ObjectNode(T v)
 {
  m_var = v;
 }
 void print()
 {
  print(m_var);
 }
protected:
 void print(int i)
 {
  printf("int (%d)\r\n", m_var);
 }
 void print(float f)
 {
  printf("float (%f)\r\n", m_var);
 }
 T m_var;
};

int _tmain(int argc, _TCHAR* argv[])
{
 ObjectNode<int> tInt(5);
 ObjectNode<float> tFloat(5.5);
 tInt.print();
 tFloat.print();
 getchar();
 return 0;
}

基本上我需要一个对象树(所有的基本类型都相同),我可以用这些扩展函数调用它。最初我使用访问者模式并为我需要的每个扩展功能创建一个访问者类。这看起来很麻烦,我想也许上面的会更好。

我想我会先在这里发帖作为完整性检查..

提前致谢。

最佳答案

您是否考虑过为您希望打印的每种类型专门化您的模板?这应该可以在不改变您调用代码的方式的情况下工作 - 但它还会提供一些编译时类型检查以确保您的通用类型具有有效的 print() 方法。

template<>
class ObjectNode<int> : public virtual ITreeNode {
    ObjectNode(int v) : m_var(v) {}
    void print() {
        printf("int (%d)\r\n", m_var);
    }
protected:
    int m_var;
};

template<>
class ObjectNode<float> : public virtual ITreeNode {
    ObjectNode(float v) : m_var(v) {}
    void print() {
        printf("float (%f)\r\n", m_var);
    }
protected:
    float m_var;
};

关于c++ - 这是 "recognised"OO 模式吗?需要健全性检查!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3326433/

相关文章:

C++从char中删除子字符串

c++ - 如何连续读取标准输入?

c++ - 如何在链表中重载运算符++

c++ - 按给定条件拆分给定的std::variant类型

java - 多态歧义区分是如何工作的?

javascript - 捕捉/监听函数的执行

python - 我应该使用静态方法还是顶级函数

java - DAO 可以保存状态信息吗

java - 如何围绕具有相似行为的不相交类型设计代码?

c# - 为什么我需要单例设计模式?