Что я могу использовать модификатор private final
в Scala?Использование частного финального модификатора Scala?
Учитывая приведенный ниже код:
1| class A { def callFoo = foo; private final def foo = "bar of A" }
2| class B extends A { private final def foo = "bar of B"}
3| println((new A()).callFoo)
4| println((new B()).callFoo)
линии 3 и 4 напечатает:
1| bar of A
2| bar of A
Вполне понятно, почему линия 2 не печатает bar of B
, потому что есть на самом деле два foo
определения и последние в B не переопределяет первое в A. В противном случае Scala потребует override
- вместо модификатора final
.
Почему Scala не просто запрещает комбинацию модификаторов private final
?
Я не думал о дополнительной области, которую может иметь модификатор. Вы правы, имея конфиденциальное определение пакета, 'final' запрещает его отменять. В этом случае это имеет смысл. Но в противном случае я думаю, что языковая конструкция без эффекта не должна быть законной. Здесь, если 'final' не препятствует переопределению определений подклассов или признаков, то они не должны использоваться в объявлении. –
@ Исследуйте причину, по которой 'final' не предотвращает переопределение подклассов/признаков, переопределяющих определение, потому что' private' уже предотвратил это. 'private' члены не видны для подклассов, поэтому переопределение нечего. Чтобы это было проблемой, вам программисту пришлось бы сделать две различные ошибки: 1) попытка переопределить частный метод и 2) забыть использовать ключевое слово 'override'. Это то же самое в Java, за исключением того, что Java более подвержен ошибкам, поскольку аннотация '@ Override' является необязательной. –