方法只能从 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 中设置 op1
和 op2
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() { ... };
}
假设我有一个提供 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 中设置 op1
和 op2
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() { ... };
}