『隠蔽化』ってどういうこと?
まず、インターフェイスを調べるとよく目にするのは『隠ぺい化』という言葉。これはあるクラスの中に幾つものメソッドやプロパティが詰め込まれていたとします。しかし、そのクラスのインスタンスの生成時に型として指定したインターフェイスによって、使用できるもの(プロパティやメソッドなど)が限定されます。そのクラスの中で使用できるものを限定できるということです。
例えば該当クラスの基底クラスとして、getアクセサしか持たない読み取り専用のインターフェイスを作成し、このインターフェイスを継承します。不用意にプロパティを書き換えられないようにする、という使い方が可能と言えます。
継承されることが前提
インターフェイスは継承されることが前提です。どんなメソッドやプロパティが必要か、派生クラスの設計図と捉えることができます。中身はなし
あくまで設計図ですので、アクセサやメソッドの中身(実装)は派生クラスで行います。プロパティの型の他、メソッドの引数や戻り値の型などを指定します。インターフェイスは型
該当クラスのインスタンスを受け取る際の引数の型として、その状況に最適なインターフェイスを指定する、という方法で間違ったクラスの使い方を防ぐ予防策となるのではないでしょうか。渡された側で型(インターフェイス)をキャストでもしない限り、つまり渡された型のままで使用すれば間違いを減らすことが出来るということです。インスタンスは生成できない
インターフェイスはインスタンスを生成できません。インターフェイスを継承する派生クラスはPublicなどのアクセス可能な修飾子です。ということはインターフェイスを介さずともそのクラスを使用することは可能ということになります。
インスタンスを生成する際の型の指定としてインターフェイスは使われてもインスタンスは該当のクラスということになります。ということは強制的にインターフェイスを使用させることはできないということでもあります。そしてインターフェイスは所詮「型」であるため、キャストしてしまえばインターフェイスで定義したルールを無視することも出来てしまいます。
このため結局のところ、コーディングの際の規則として、例えば「このクラスをここで使用する場合はこのインターフェイスを使用して下さい」的なルールが存在すること前提の機能と考えた方が良い。
その他
インターフェイスで定義されたプロパティやメソッドなど、これら全てが派生クラスに存在しなければならない。逆に継承するインターフェイスに定義されていないプロパティやメソッドなどを派生クラスで作成することは可能です。
インターフェイスから継承したメンバは基本的には全てPublicです。
クラスは一つしか継承出来ません(多重継承禁止)がインターフェイスはいくつでも継承可能です。
インターフェイスでコンストラクタの定義はできません。
delegateでイベントに使用するなどのメソッドの型を定義することは出来ません。
operatorをイジることは出来ません。
0 Comments:
コメントを投稿