gpt4 book ai didi

scala - 为什么可以在其定义范围之外看到对象的 protected 内部类?

转载 作者:行者123 更新时间:2023-12-04 17:32:48 40 4
gpt4 key购买 nike

考虑以下几点:

scala> :paste
// Entering paste mode (ctrl-D to finish)

object O {
protected case class I(x: Int)
trait T {
protected def m: I = I(0)
}
}

val i = new O.T { override def m = super.m }.m

// Exiting paste mode, now interpreting.

defined object O
i: O.I = I(0)

scala> :type i
O.I

如果我在 val i 之后添加 : O.I 此代码片段无法编译,但语句 i.x 编译并返回 0 在运行时。

这是编译器错误还是有充分的理由出现这种行为?

最佳答案

派生类在任何情况下都可以brake protection因为他们可以完全访问基类保护的成员。考虑下面的公共(public)方法 foo

val i = new O.T {
override protected def m = super.m
def foo = m
}

我们将 m 保持为 protected,尽管如此,i.foo 会间接“脱离”保护并评估为 res0:O.I = I(0)。因此,似乎我们通过防止覆盖覆盖并没有获得太多 yield 。

同时考虑对 When overriding a method, why can I increase access but not decrease it? 的相关回答:

It's a fundamental principle in OOP: the child class is a fully-fledged instance of the parent class, and must therefore present at least the same interface as the parent class.

关于scala - 为什么可以在其定义范围之外看到对象的 protected 内部类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57976324/

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