只能从超类(C ++和其他语言)访问的方法

时间:2016-03-07 10:49:22

标签: java c++ matlab oop template-method-pattern

假设我有一个提供公共模板方法的超类。子类必须实现一些子操作。如何声明此子操作以确保只能从SuperClass调用它们?那里有protected,但据我所知,它可以反过来工作:子类可以访问受保护的超类成员。 我想允许超类(只有超类!)来调用子类成员。

class SuperClass{
    public:
      void templateMethod(){
         this->op1();
         this->op2();
      } 

      // how to declare these? public? protected?
      virtual void op1() = 0;
      virtual void op2() = 0;
}

class SubClass : public SuperClass{
      // how to declare these? public? protected?
      virtual void op1() { ... };
      virtual void op2() { ... };
} 

我目前在C ++和Matlab工作,但我也对考虑其他语言的一些一般性评论非常感兴趣。

3 个答案:

答案 0 :(得分:1)

在两种情况下都使用“私人”

可以从超类调用私有方法,因为Supercalss不知道SubClass中覆盖方法的可访问性

答案 1 :(得分:1)

在C ++中,您可以通过在所有类中op1op2 private来实现您的目标。这种技术在C ++中是惯用的。

基类通过在实例化对象时设置的v-table访问子类中的private函数。

当然,没有什么能阻止子类中的另一个函数调用该子类中标记为private的函数。如果你想要那个,那么子类将不是该函数的正确位置。

对于Java来说也是如此,当然virtual是自动的。

答案 2 :(得分:0)

class SuperClass{
    public:
      void templateMethod(){
         op1();
         op2();
      } 

    private:
      virtual void op1() = 0;
      virtual void op2() = 0;
}

不需要写私信,但在界面上提供一些信息很好。

class SubClass : public SuperClass{
      virtual void op1() { ... };
      virtual void op2() { ... };
} 

等于

class SubClass : public SuperClass{
    private:
      virtual void op1() { ... };
      virtual void op2() { ... };
}