JAVAを学び始めたころ、インターフェースというのが今ひとつ理解できませんでした。クラス定義の際に付加するimplements XXXってやつです。
implements XXXって書いただけではダメで、implements XXXって書いたからには、そのインターフェースに定義されているいろいろな抽象メソッドを実際に実装(コーディング)しなければなりません。しないとコンパイルエラーとなってしまいます。
継承の場合は、extends YYYと書けば、そのクラスに含まれるいろいろなメソッドが使えるようになるので、メリットがわかりやすいのに対し、インターフェースの場合は、結局最後に自分でコーディングしなければならないのに、なぜimplements XXXとわざわざ書く必要があるのかと…。
インターフェースのメリットの一つは、対象のクラスが実装しているインタフェースが分かれば、どんなメソッド名に何の引数を与えれば、どんな型の戻り値が得られるのかが分かる、ということです。
しかし、これはどのインターフェースにどのメソッドが定義されているか知っている場合であって、特に初学者はそんなことわかりません。むしろ関係ない抽象メソッドまで全て実装しなければならない手間(デメリット)のほうが大きいと思われます。
設計をやるようになってだんだんわかってきたのは、設計者がインターフェースを定義し、プログラマーがそのインターフェースを実装する、ということです。
設計者はあるシステムを構築する際、こんな機能を提供してくれるクラスがあればいいなぁと考えますが、実際にそのクラスを作成(コーディング)しません。作成するのは別のプログラマーです。
設計者はそのクラスの機能の呼び出し方(メソッド名と引数)と、戻り値だけを決めます。つまりそのクラスのインターフェース(窓口)だけを決めるのです。
定義された引数を受け取り、定義された戻り値を返すようなコーディング(機能の実現の仕方)はいろいろ考えられますが、それはプログラマーにゆだねられます。
|
|