Tim*_*ske 12 inheritance scala modifier
我可以private final在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)
Run Code Online (Sandbox Code Playgroud)
3号线和4号线打印:
1| bar of A
2| bar of A
Run Code Online (Sandbox Code Playgroud)
可以理解为什么第2行不打印,bar of B因为实际上有两个foo定义而B中的后者不会覆盖A中的前者.否则Scala将需要override- 而不是final修饰符.
那么Scala为什么不简单地禁止修饰符的组合private final呢?
agi*_*eel 14
好的,这很棘手.你的问题:"那么为什么Scala不会简单地禁止修改私人决赛的组合?" 是基于这种组合没有用的假设.
假设你是对的(除了细节之外,你将会在后面提到).我不是编译人员,但从我的观点来看,"简单禁止"可能并不那么简单(至少在这种情况下).为什么有人会尝试这样做呢?有什么权衡取舍?只是因为某些东西没用,并不一定意味着它会造成任何伤害.只是不要用它......
现在这里出现了你似乎忽略的微小细节.该private改性剂是一种可见性修饰符,这意味着class B是不知道它的存在.但Scala的可见性修饰符比Java更复杂.让我们假设无论出于何种原因你需要在下面的代码片段中显示代码,编译器都不会允许它.
package scope
class A {
def callFoo = foo;
private[scope] final def foo = "bar of A"
}
class B extends A {
private[scope] final def foo = "bar of B"
}
object Main extends App {
println((new A()).callFoo)
println((new B()).callFoo)
}
Run Code Online (Sandbox Code Playgroud)
这是编译器提供的错误之一:"方法foo不能覆盖最终成员".
所以,你走了.Scala只是禁止这种组合;)