インターフェースの概要
インターフェース(= interface)は、クラスに実装させたい機能の宣言のみを行っているものです。そのため、宣言されているメンバはすべて abstract(= 抽象) です。つまり具体的なメンバの処理実体は定義されていません。もっと言ってしまえば、インターフェースは文字通り クラスの入出力部分の仕様を定義したもの にすぎないわけです。
クラスに対してインターフェースを実装することで、そのクラスが何であれインターフェースに宣言されている機能については実装されていることが約束されていることになります。これはオブジェクト指向プログラミングの ポリモーフィズム(= 多態性) を実現するために役立ちます。先に言っておくべきでしたが、インターフェースの概念は関数型プログラミングとは大きく異なるOOP世界の考え方です。OOPについては別記事にて紹介しようと思うので、ここでは簡易的な紹介に留めておきます。
以下は簡略化したインターフェースの構文になります。
// ------------------
// [ 構文 ]
// ------------------
[<attributes>]
type interface-name = interface
abstract member member1 : [ argument-types1 -> ] return-type1
abstract member member2 : [ argument-types2 -> ] return-type2
...
abstract member memberN : [ argument-typesN -> ] return-typeN
end
// or
[<attributes>]
[<Interface>]
type interface-name =
abstract member member1 : [ argument-types1 -> ] return-type1
abstract member member2 : [ argument-types2 -> ] return-type2
...
abstract member memberN : [ argument-typesN -> ] return-typeN
構文を見てもらうとわかるとおり、インターフェースには abstractなメンバ しか宣言されていません。また、そのメンバに具体的な実装はしません。
各要素については次節で紹介しますので、今節は IHeatインターフェース の interface - end の部分に注目していきます。これは 冗語構文 と呼ばれる記述方法です。また、IHeatB / IHeatC インターフェース のような方法(= オフサイドルールを利用する方法)を 軽量構文 と呼びます。
また、冗語構文と軽量構文のメリット・デメリットについては こちら をご参照ください。
インターフェースの宣言では、インターフェース名に I プレフィクスを付与することが一般的です。インターフェース名には必ず I プレフィクスを忘れずにつけるようにしましょう。
サンプルでみるインターフェース
前節でインターフェースの簡単な構文を紹介しました。本節では簡易的なサンプルを利用して、実際の値と構文の説明がどう対応しているかを見ていきたいと思います。今回のサンプルは前節と同様の IHeat型 を利用していきたいと思います。
繰り返しとなりますが、下記は IHeat型 の定義となります。
下記の表は内包している要素と構文の要素名とを対応付けたものとなります。ただし重複する内容のものに関しては省略しています。
また、改めてインターフェースの宣言構文も記載しています。
// ------------------
// [ 構文 ]
// ------------------
[<attributes>]
type interface-name = interface
abstract member member1 : [ argument-types1 -> ] return-type1
abstract member member2 : [ argument-types2 -> ] return-type2
...
abstract member memberN : [ argument-typesN -> ] return-typeN
end
要素名 | 対応するIHeat型の要素 |
---|---|
interface-name | IHeat |
member1 | Heat |
argument-types1 | double |
return-type1 | double |
インターフェースの構成は抽象メンバの宣言のみなので、非常にシンプルです。
最初に [ interface-name ] を指定し、クラスや構造体に実装してもらいたいメンバを宣言すればよいわけです。メンバを宣言する際は必ず abstractキーワード を付けなければならない点に注意が必要です。
インターフェースは.NETプログラミングにおいてポリモーフィズムを実現するための重要な型なので、きちんと使えるようになりましょう。