什麼可以在Scala中使用private final
修飾符?使用斯卡拉的私人最終修飾符?
考慮下面的代碼:
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
修飾符。
那麼爲什麼斯卡拉不是簡單地禁止修飾符private final
的組合?
我沒有想到修改器可以具有的附加範圍。你是對的,有一個私人定義,'final'禁止覆蓋它。在這種情況下它有用處。但除此之外,我認爲沒有效果的語言結構一定不合法。在這裏,如果'final'不能阻止子類或特徵覆蓋定義,則不能在聲明中使用它。 –
@Tim「final」的原因並不妨礙子類/特徵覆蓋定義是因爲'private'已經阻止了這個。 'private'成員對子類不可見,所以沒有什麼可以重寫。因爲這是一個問題,程序員必須犯兩個不同的錯誤:1)試圖重載一個私有方法,2)忘記使用'override'關鍵字。這在Java中是一樣的,因爲'@ Override'註釋是可選的,所以Java更容易出錯。 –