2016-10-02 85 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'只是爲了說明一些情況。 –

相關問題