【问题标题】:design pattern such that access to the Derived class is only possible through a library [closed]设计模式使得只能通过库访问派生类[关闭]
【发布时间】:2013-01-13 12:15:19
【问题描述】:

试图实现一种设计,其中实现接口的类只能从库中调用。换句话说,对实现的接口的访问应该是通过库(TopLib)。似乎应该使用委托的情况。你觉得这个设计怎么样?这是可行的,但希望得到反馈和建议,使其变得更好、更健壮和万无一失。

class Interface 
{
protected:
    virtual void hi(void) = 0;
};

class ABC : private Interface {
protected:
    ABC() {}
    virtual void hi() {
        std::cout << "abc" << std::endl;
    }
};

class XYZ : private Interface {
protected:
    XYZ() {}
    virtual void hi() {
        std::cout << "xyz" << std::endl;
    }
};

template<typename T>
class TopLib : private T
{
public:
    void sayhi() {
        hi();
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    TopLib<ABC> b;
    b.sayhi();

    TopLib<XYZ> c;
    c.sayhi();
    //c.hi(); <- fails

    //ABC test; <- fails
    //test.hi(); <- fails

    getchar();
    return 0;
}

【问题讨论】:

  • 您的标题是 C,但您的标签和代码是 C++。是哪个?
  • 显然是微软 C++。
  • c.hi(); 不会失败吗? hi() 是受保护的成员。
  • 真正的问题是:它应该有什么用?现在我看不出它会如何更好或更容易地使用你的库。
  • 此代码有效。想知道是否有更好的方法来确保主程序仅通过库与接口实现对话。如果可能的话,任何其他优化也会有所帮助。

标签: c++ design-patterns inheritance delegates class-design


【解决方案1】:

在派生类中可以放宽访问修饰符,因此您可以任由实现接口的那个人摆布。没有什么能阻止我说出来

class FooBarBaz : private Interface {
  public:
    FooBarBaz() {}
    virtual void hi() { // Implements Interface::hi()
        std::cout << "see what i mean!" << std::endl;
    }
};

在有或没有TopLib&lt;FooBarBaz&gt;的情况下使用它。

【讨论】:

  • 谢谢你奥斯瓦尔德。我猜你是说,我可以使用“类 XYZ:受保护的接口”?而不是私人的?
  • 有没有办法解决这个问题?
  • 特别是,我说有人可以使用public: virtual void hi() 来实现你的接口。我不知道如何解决这个“问题”,但实际上我不明白为什么这是一个问题。就像bikeshedder说的:它应该有什么好处?
  • 知道了。只要实现接口的人细心,主程序就无法直接访问该接口,设计目标基本达到。感谢大家的投入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 2011-10-02
  • 2021-12-05
相关资源
最近更新 更多