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

Можно указать модификаторы доступа для членов типа, как поля. В случае ООП хорошо понимается, что поля 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] type TypeMember = A' или' private [this] type TypeMember <: A' или 'private type TypeMember = A' или' protected [this] type TypeMember = A' или 'protected type TypeMember = А просто проиллюстрировать несколько случаев. –

Смежные вопросы