C ++ — стиль частного доступа в Scala?

В C ++ можно иметь (пожалуйста, прости ошибки, поскольку я не делал C ++ некоторое время, и исправления приветствуются):

class Super {
private: virtual void g() = 0;
public: void f() {
g();
}
};

class Sub: public Super {
private: virtual void g() {
}
};

такой, что Sub определяет g но не могу назвать это напрямую.

Можно ли сделать то же самое в Scala?

3

Решение

Если вы попробуете это так

abstract class Super {
private def g()

def f() {
g()
}
}

компилятор выдаст вам это сообщение об ошибке:

scala: абстрактный член не может иметь приватный модификатор
личное определение g ()

Вы должны объявить g() по крайней мере protected,

2

Другие решения

Я думаю, что самая близкая вещь

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 не поддерживает его, но многие шаблоны доступа уже являются вымыслом компилятора.)

0

По вопросам рекламы [email protected]