- PR -

インタフェースの実装に関して

1
投稿者投稿内容
ゆう
常連さん
会議室デビュー日: 2001/12/10
投稿数: 33
投稿日時: 2001-12-10 09:56
初めまして、ゆうと申します。
仕事でJAVAのコーディングをやっています。

一応、開発システムが終わって、JAVAについてわからなかったことなどを勉強しているのですがインタフェースの書き方に関して疑問が残りました。
下記のようにインタフェースとそのメソッドを実装したクラスを作成して
インタフェースのメソッドを使う場合に、一番下のTestクラスで2通りのインスタンス化が行えます。書籍等では↓のように記述されていますが、
Interface q = new JapaneseInterface();
^^^^^^^^^
私は↓のように記述していました。
JapaneseInterface j = new JapaneseInterface();
^^^^^^^^^^^^^^^^^
これに関してどちらが正しいのか、違いは何かが良く分かりません。
どなたか教えてください。よろしくお願いします。

//インタフェース
interface Interface{
public String quote(String s);
}

//インタフェースのメソッドを実装したクラス
class JapaneseInterface implements Interface{
public String quote(String s){
return s ;
}
}

//実際にメソッドを使うクラス。
class Test{
public static void main(String args[]){
  //Interface型でインスタンス化
Interface q = new JapaneseInterface();
System.out.println(q.quote("JAVA"));

//JapaneseInterface型でインスタンス化
JapaneseInterface j = new JapaneseInterface();
System.out.println(j.quote("JAVA"));
}
}
miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2001-12-10 10:31
Interfaceは「型」である、という簡単な例を紹介します。
まず、次のようなメソッドを用意しておきます。

static Interface createInterface() {
return new JapaneseInterface();
}

クライアントでは次のようにしてインスタンスを生成するようにコードを修正して、new JapaneseInterface()というコードを無くしておきます。

Interface q = createInterface();

ここで、後からInterfaceを実装したJapaneseInterface2というクラスを開発したとしても、createInterfaceメソッドだけを書き換えれば、既存のクライアントは一切変更せずに動作します。クライアントのサイズが大きい場合を考えて見てください。このような作り方は非常に柔軟であることがおわかりになると思います。

このようなことが可能なのは、クラスJapaneseInterfaceとJapaneseInterface2は同じInterfaceという「型」を実装しているからです。もし、クライアントに直接new JapaneseInterface()というコードを埋め込んでいたらコードを拡張するには、JapaneseInterfaceのサブクラスを作るしかなくなりますが、インタフェースを使えばJapaneseInterface2はJapaneseInterfaceのサブクラスである必要はありません。

ふる
会議室デビュー日: 2001/11/29
投稿数: 5
投稿日時: 2001-12-11 00:43
インターフェースですが
消防士インターフェースは消火というメソッドを持っている
とします。その場合、実装はどんなクラスであったとしても
消防士インタフェースをimplements(実装)していたとしたら
消防士ということができます。

つまり、プログラムのインタフェースと実装を切り離したい
場合に有効でよく使われる手段です。

> Interface q = new JapaneseInterface();
> ^^^^^^^^^
左辺の宣言部分は右辺のオブジェクトを指定しているオブジェクト
を消防士として扱うための宣言です。右辺が消防犬であっても消防猫
であっても、消火活動を行える人であってもimplements消防士であれば
同じように宣言することができます。

> JapaneseInterface j = new JapaneseInterface();
> ^^^^^^^^^^^^^^^^^

引用の上と下の違いは
消防犬を消防士として扱うのか(上引用)...インタフェースで利用
消防犬を消防犬として扱うのか(下引用)...実装クラスとして利用
の違いです。

Javaをマスターしたならば習得は必須条件になると思います。
1

スキルアップ/キャリアアップ(JOB@IT)