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

Method only accessible from super-classes (C++ and other languages)

假设我有一个提供 public 模板方法的超级 class。 Subclasses 将不得不执行一些子操作。我如何声明此子操作以确保只能从 SuperClass 调用它们?有 protected,但据我所知,这是相反的:Subclasses 可以访问受保护的 superclass 成员。 我想允许超级classes(而且只有超级classes!)调用子class成员。

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,但我也对考虑其他语言的一些一般性评论非常感兴趣。

在两种情况下使用 "private"

可以从超类调用私有方法,因为 Supercalss 不知道子类中重写方法的可访问性

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

基 class 通过 v-table 访问 child class 中的 private 函数这是在实例化 object 时设置的。

当然,没有什么可以阻止您的 child class 中的另一个函数调用 child class 中标记为 private 的函数。如果您想做 that,那么 child class 将不是该函数的正确位置。

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

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

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

不用写private,不过在界面上给点信息就好了

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

等于

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