gpt4 book ai didi

scala - 使用 Scala 的私有(private) final 修饰符?

转载 作者:行者123 更新时间:2023-12-04 00:42:50 25 4
gpt4 key购买 nike

我可以使用 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)

第 3 行和第 4 行打印:
1| bar of A
2| bar of A

可以理解为什么第 2 行不打印 bar of B因为实际上有两个 foo定义和 B 中的后者不会覆盖 A 中的前者。否则 Scala 将需要 override - 而不是 final修饰符。

那么为什么 Scala 不简单地禁止修饰符 private final 的组合? ?

最佳答案

好的,这很棘手。您的问题: “那么为什么 Scala 不简单地禁止修饰符 private final 的组合呢?” 是基于这种组合没有用的假设。

假设你是对的(你是对的,除了一个小细节,稍后会提到)。我不是编译器,但从我的角度来看,“简单禁止”可能根本没有那么简单(至少在这种情况下)。为什么有人会尝试这样做?有哪些取舍?仅仅因为某些东西没有用并不一定意味着它会造成任何伤害。只是不要使用它...

现在,您似乎忽略了一个微小的细节。 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)
}

这是编译器提供的错误之一: “方法 foo 不能覆盖最终成员” .

所以给你。 Scala 只是禁止这种组合;)

关于scala - 使用 Scala 的私有(private) final 修饰符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7318118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com