C#をつつく27ーインターフェイス。約束は守ろう。2008-08-07 Thu 21:29
今回はインターフェイスをつつくピヨ。インターフェイスとは、オブジェクトが持つべき要素を定義したものなんだ。一説によるとこの概念はCOM(Componet Object Model)から受け継いだものらしい。でも、Javaとか既存言語からある概念だから、.NETのインターフェイスはCOMと既存のインターフェイスの融合だと思うピヨ。
じゃあ、早速インターフェイスの定義方をつつくピヨッ!
どう?難しくないよね♪インターフェイスの定義はinterfaceキーワードを使用するところと、Publicとかのアクセス修飾子を指定しない点と、実装を書かない点がが特徴ピヨ。何故アクセス修飾子を指定しないのかというと、.NETではインターフェイスは基本的に外部に対する約束事だからなんだよ。 この定義したインターフェイスを実装するクラスは次のようにするピヨ。
C#ではクラス名 : インタフェース名で指定して実装するんだ。VB.NETみたいに、一々各要素でどのインタフェース要素を実装するのかを宣言しなくてもいいピヨ。その代り、VB.NETとは違って、複数に対応する事は不可能なんだ。仕方がないよね。 あと、C#は基本的にインタフェースを明示しないけども明示的実装は可能ピヨ。こんな風にね。
説明するね。インタフェースの明示的実装はインタフェース名.要素名で宣言するピヨ。ここで注意しなくてならないのはアクセス修飾子は指定できないということピヨ。何故かというと、C#コンパイラがprivateに設定するからなんだ。勝手につけられたら困るわけだね。アッ忘れるところだった。それと、明示的実装をする際にはvirtualキーワードはつけられないピヨ。この理由は、インターフェイスを実装する型に属せず、インターフェイスに属すると看做されるからピヨ。これについては、わかりにくいと思うけど、説明しだすと長いから違う機会にするよ。 それで、何故こんな機能が必要なのかというと、複数のインターフェイスを実装する際に名前が同じ場合があるからなんだ。こんな風にね。
こんな場合IFoo.FooMethodとIBar.FooMethodと明示的に実装すればOKなんだよ。その代り使用する際にはこんな風にキャストが必要になるけどね。
ちょっと面倒くさいけど、どれを実行していいのかわからないから仕方がないよね。 最後に、インターフェイスとクラスの使い分けについて囀るピヨ。クラスは縦に継承されていくけど、インターフェースは横に継承される点が違うピヨ。 クラスの場合、親から子へと意味ある継承をするけど、全ての状況に対応できるわけじゃないんだ。 何故かというと、直接的には関係ないけど同じ要素を持つことがあるからなんだ。 クラスの継承は親子の遺伝。 インターフェイスの継承は師弟関係と覚えたらいいよ。 今回はこれで終わり。 |
この記事のコメント |
コメントの投稿 |
||
|
|
||
| 管理者だけに閲覧 | ||
|
|
||
この記事のトラックバック |
|
| 無差別に技術をついばむ鳥 |
|