Do czego mogę użyć modyfikatora private final
w Scali?Używanie prywatnego ostatecznego modyfikatora Scala?
Biorąc pod uwagę poniższy kod:
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)
Linia 3 i 4 druki:
1| bar of A
2| bar of A
Jest zrozumiałe, dlaczego linia 2 nie drukuje bar of B
ponieważ istnieją właściwie dwa foo
definicje i ten ostatni w B nie zastępuje pierwszego w A. W przeciwnym razie Scala wymagałby modyfikatora override
- zamiast modyfikatora.
Dlaczego więc Scala nie zabrania po prostu kombinacji modyfikatorów private final
?
Nie myślałem o dodatkowym zasięgu, jaki może mieć modyfikator. Masz rację, mając definicję prywatną pakietu, 'final' zakazuje jej przesłonięcia. W tym przypadku ma zastosowanie. Ale w przeciwnym razie myślę, że konstrukt językowy bez efektu nie może być legalny. W tym przypadku, jeśli "final" nie uniemożliwia podklasom lub cechom nadpisanie definicji, to nie może być używane w deklaracji. –
@Wskazuj, że powód "ostateczny" nie zapobiega podklasom/cechom przesłaniającym definicję, ponieważ 'prywatny' już temu zapobiegał. "prywatne" elementy nie są widoczne dla podklas, więc nie ma co nadpisywać. Aby to było problemem, programista musiałby wykonać dwa odrębne błędy: 1) próby zastąpienia metody prywatnej i 2) zapomnienia użycia słowa kluczowego 'override'. Tak samo jest w Javie, z tym że Java jest bardziej podatna na błędy, ponieważ adnotacja '@ Override' jest opcjonalna. –