【问题标题】:Method only accessible from super-classes (C++ and other languages)只能从超类(C++ 和其他语言)访问的方法
【发布时间】:2016-06-20 21:19:22
【问题描述】:

假设我有一个提供公共模板方法的超类。子类必须实现一些子操作。如何声明此子操作以确保它们只能从 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,但我也对考虑其他语言的一些一般性评论非常感兴趣。

【问题讨论】:

  • 在 C++ 中,它们可以是公共的、受保护的或私有的。这实际上取决于您是否要在基类中公开它们。我通常会选择private,除非有充分的理由不这样做。但是你应该将其限制为一种单一的编程语言,除非你确定行为是相同的。
  • 可以从超类调用private 方法?不知道那个。但这是有道理的,因为它们是在该超类中声明的 virtually
  • 是的,这是一种常见的模式。 “模板方法”或类似的东西。有些人使用protected,通常没有充分的理由,但private 可以正常工作。
  • 您的问题很广泛,没有人可以解释一组未知编程语言的可见性规则。我建议更新问题并首先询问 C++。如果您以后在将概念适应另一种语言时遇到问题,请提出一个新问题。

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


【解决方案1】:

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

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

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

Java 也可以这样说,当然 virtual 是自动的。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      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() { ... };
      } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多