代码之家  ›  专栏  ›  技术社区  ›  Patrick

在接口中公开方法,但在实现中受保护的好处是什么?

  •  3
  • Patrick  · 技术社区  · 14 年前

    在我的C++应用程序中,我有一个这样的界面:

    class ICalculator
       {
       public:
          virtual double calculateValue(double d) = 0;
       };
    

    我有这样的接口实现:

    class MySpecificCalculator
       {
       public:
          virtual double calculateValue(double d);
       };
    

    现在我的同事对此抱怨,并告诉我最好保护calculateValue方法。这样,我们可以保证调用方总是通过接口而不是直接实现。

    这是正确的观察结果吗?保护接口的实现真的更好吗?或者我们不能把它保密吗?

    2 回复  |  直到 14 年前
        1
  •  10
  •   Chubsdad    14 年前

    你的同事是对的。

    Never make virtual functions public.

    指南1:首选 非虚拟接口,使用模板 方法。

    准则2:倾向于 使虚拟函数私有化。

    准则3:仅当派生类 需要调用基本实现 在虚拟函数中 虚拟功能受保护。

    对于析构函数的特殊情况

    准则4:基类析构函数 应该是公开的和虚拟的, 或是受保护的,非虚拟的。

        2
  •  0
  •   hansmaad    14 年前

    class ICalculator
    {
    public:
        virtual double calculateValue(double d) const = 0;
    };
    
    class MySpecificCalculator : public ICalculator
    {
    protected:
        double calculateValue(double d) const;
    };
    
    void Calc(double d, const ICalculator& c)
    {
        std::cout << "Result = " << c.calculateValue(d) << std::endl;
    }
    
    int main ()
    {
        MySpecificCalculator c;
        c.calculateValue(2.1);  // dont do this
        Calc(2.1, c);  // do this instead
        return 0;
    }
    

    我看不出这个设计有什么好处。为什么不能从一个具体的引用调用calculate。若要在派生类中将calculateValue移动到protected,请破坏基类的约定。不能使用MySpecificCalculator计算值,但它的基类是这样说的。