2016-10-02 8 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 
} 

それを保護することについては、意味があるかもしれません。例:次に、未指定のタイプVに加工方法からなるインターフェースを定義し、

trait Foo { 
    protected[this] type V 

    def foo(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型TypeMember = A'または 'protected [this型] TypeMember = A'または' protected型TypeMember =いくつかの事例を説明するだけです。 –

関連する問題