В C ++ можно иметь (пожалуйста, прости ошибки, поскольку я не делал C ++ некоторое время, и исправления приветствуются):
class Super {
private: virtual void g() = 0;
public: void f() {
g();
}
};
class Sub: public Super {
private: virtual void g() {
}
};
такой, что Sub
определяет g
но не могу назвать это напрямую.
Можно ли сделать то же самое в Scala?
Если вы попробуете это так
abstract class Super {
private def g()
def f() {
g()
}
}
компилятор выдаст вам это сообщение об ошибке:
scala: абстрактный член не может иметь приватный модификатор
личное определение g ()
Вы должны объявить g()
по крайней мере protected
,
Я думаю, что самая близкая вещь
abstract class Super {
protected[this] def g: Int
def f { println(g) }
}
class Sub extends Super {
protected[this] def g = 5
}
но это не дает Super
любой Больше права доступа, чем Sub
; это просто мешает Sub
от вызова этого метода в других случаях.
Точно такой же шаблон невозможен в Scala. (Это должно было бы быть вымыслом компилятора, поскольку JVM не поддерживает его, но многие шаблоны доступа уже являются вымыслом компилятора.)