gpt4 book ai didi

scala - 什么时候应该对类型成员使用访问修饰符?

转载 作者:行者123 更新时间:2023-12-05 00:54:34 26 4
gpt4 key购买 nike

class EG {
private[this] type TypeMember = A
private[this] var field: Int = 0
}

可以为类型成员指定访问修饰符,就像字段一样。在 OOP 的情况下,很容易理解 encapsulation of fields 确实提供了防止意外共享状态和限制状态修改的好处。据我所知,类型成员只能在 Scala 中找到,并且在许多地方它们只是被定义为公共(public)的,因此在类型成员上使用访问修饰符并不像在字段的情况下那样被很好地理解。类型成员不持有任何状态,如变量或字段。由于它不包含值,因此无法对其进行变异。 所以我的问题是你应该在哪些地方限制对类型成员的访问(将类型成员定义为私有(private)或 protected )?

最佳答案

制作类型成员声明 不提供定义的私有(private)不仅没用而且编译器也不允许

scala> class Foo { private[this] type T }
<console>:11: error: abstract member may not have private modifier
class Foo { private[this] type T }

如果你 定义 type 成员,那么可能会有一些合法的用例。

示例,私有(private)类型别名:
trait Foo {   
private[this] type T = String
}

在这种情况下,类型 T只存在于类内部。仅在实现的上下文中为类型提供较短的名称可能很有用。

另一个例子,类型参数的私有(private)重命名
trait Foo[Key] {
private[this] type K = Key
}

使用大致相同的用例。

关于使其受到保护,这也可能是有道理的。例子:
trait Foo {
protected[this] type V

def foo(v: V): V
}

它定义了一个接口(interface),该接口(interface)由一个在尚未指定的类型上工作的方法组成 V , 进而:
class Bar extends Foo {
type V = String // actually defining the type
def foo(v: V): V = v
}

关于scala - 什么时候应该对类型成员使用访问修饰符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39815876/

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