2016-10-02 84 views
4
class EG { 
    private[this] type TypeMember = A 
    private[this] var field: Int = 0 
} 

可以像字段一样为类型成员指定访问修饰符。在OOP的情况下,我们很清楚,领域的encapsulation确实提供了有益于防止意外共享状态和限制状态修改的好处。就我所知,类型成员只能在Scala中找到,而且在很多地方,它们只是被定义为public,因此在字段成员中对类型成员的访问修饰符的使用并不是很好理解。类型成员不像变量或字段那样拥有任何状态。由于它不具有值,因此不能进行变异。 所以我的问题是你应该限制对类型成员的访问的位置是什么(将类型成员定义为私有或受保护的)?什么时候应该对类型成员使用访问修饰符?

回答

5

制作类型成员声明私人而不提供的定义不仅无用,而且不是由编译器

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

允许如果定义类型的成员,而不是,那么有可能是一些合法用例。

实施例,私人类型别名:

trait Foo { 
    private[this] type T = String 
} 

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

又如,具有大致相同的情况下,使用类型参数

trait Foo[Key] { 
    private[this] type K = Key 
} 

的私人重命名。

关于使它受到保护,它也可能是有道理的。例如:

trait Foo { 
    protected[this] type V 

    def foo(v: V): V 
} 

,其限定由上还未指定类型V工作的方法的接口,然后:

class Bar extends Foo { 
    type V = String // actually defining the type 
    def foo(v: V): V = v 
} 
+0

以上仅仅是为了说明的目的。它可以是'private [this] TypeMember = A'或'private [this] TypeMember <:A'或'private TypeMember = A'或'protected [this] TypeMember = A''或'protected Type TypeMember = A'只是为了说明一些情况。 –

相关问题