在C ++中,人们可以拥有(请原谅我的错误,因为我有一段时间没有完成C ++,并且感谢您的修正):
class Super {
private: virtual void g() = 0;
public: void f() {
g();
}
};
class Sub: public Super {
private: virtual void g() {
}
};
这样Sub
定义g
但不能直接调用它。
可以在Scala中完成同样的事情吗?
答案 0 :(得分:2)
如果你这样尝试
abstract class Super {
private def g()
def f() {
g()
}
}
编译器会给你这个错误信息:
scala:抽象成员可能没有私有修饰符
private def g()
您必须至少g()
声明protected
。
答案 1 :(得分:0)
我认为最接近的是
abstract class Super {
protected[this] def g: Int
def f { println(g) }
}
class Sub extends Super {
protected[this] def g = 5
}
但是Super
没有Sub
任何更多访问权限,而不是Sub
;它只是阻止{{1}}在其他实例上调用该方法。
Scala中无法使用完全相同的模式。 (它必须是编译器小说,因为JVM不支持它,但许多访问模式已经是编译器小说。)