假设我有一个提供公共模板方法的超类。子类必须实现一些子操作。如何声明此子操作以确保只能从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工作,但我也对考虑其他语言的一些一般性评论非常感兴趣。
答案 0 :(得分:1)
在两种情况下都使用“私人”
可以从超类调用私有方法,因为Supercalss不知道SubClass中覆盖方法的可访问性
答案 1 :(得分:1)
在C ++中,您可以通过在所有类中op1
和op2
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() { ... };
}