- PR -

インタフェースの型の継承について

1
投稿者投稿内容
hiro
会議室デビュー日: 2007/08/10
投稿数: 18
投稿日時: 2008-06-17 21:34
Javaを勉強中です。
インタフェースについわからない点がありますので教えて下さい。

 
 「通常の継承が“実装の継承”であるのに対して、
  インタフェースは“型の継承”である。」

 といった記述をよく目にしますが、型の継承とは
 どういう事なのでしょうか?

 また、そのような記事には以下のような携帯電話の実装で、
 携帯電話クラスのインスタンスを実装したインタフェースの型で
 使用する例があります。
 使用出来るのは分かるのですが、このように使用する意味は何なのでしょうか?

 public class CellPhone extends Phone implements Camera, DisitalCash {

// 電話の機能
public void call(int num) ..

// 写真の機能
public void takePicture() ..

// キャッシュ機能
public void pay(int money) ..
public void charge(int money) ..
 }

 CellPhone celpho = new CellPhone();
 Phone denwa = celpho;
 Camera kamera = celpho;


 よろしくお願いします。

[ メッセージ編集済み 編集者: hiro 編集日時 2008-06-18 05:35 ]
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-06-17 23:15
例えば、
コード:
public class WebCamera extends DigitalCamera implements Camera{
    public void takePicture(){
        ....
    }
}


というクラスがあったとした場合、
コード:
public void takePictures(Camera camera){
    camera.takePicture();
    camera.takePicture();
    camera.takePicture();
}

takePicture(new CellPhone());
takePicture(new WebCamera());


ということが出来ます。

携帯電話は電話機から派生していて、
WEBカメラはデジカメから派生しているとしても、
上記メソッドではカメラとして扱っています。

多態性と呼ばれるものです。

インターフェイスは実装を持たないので、
JDBCドライバのように、Sunが仕様だけを決め、
ベンダーがインターフェイスを実装したドライバを提供する、
というのもよくある使い方です。

以下はJDBCとは関係のない擬似コードですが、
コード:
Connection conn;
if(target == MY_SQL){
    conn = new MySQLConnection();
}else{
    conn = new OracleConnection();
}
conn.execute("select * from xxxx");
conn.close();


というように、Connectionというインターフェイスが仕様として存在し、
その仕様を満たした各ベンダーの実装を利用している、というイメージです。

なんとなくインターフェイスの意味が伝わったでしょうか?
hiro
会議室デビュー日: 2007/08/10
投稿数: 18
投稿日時: 2008-06-19 19:50
かつのりさん

 ありがとうございます。

 頂いた例ですと、良く分かりますね。
 私が書いた例はあまり使われない、メリットがないのでしょうか?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-06-19 22:54
メリットとは関係なしにモデリングを行うのはよく有ることです。
多態性を求めないオブジェクトであればインターフェイスは不要です。

ですが、後々の拡張性を考えれば、
インターフェイスを実装していると便利です。

私の例のように、インターフェイスを実装していれば、
そのコードの実装をどのように変えても、
利用する側のコードは変える必要がありません。
わたなべ
大ベテラン
会議室デビュー日: 2007/12/09
投稿数: 123
お住まい・勤務地: 札幌
投稿日時: 2008-06-20 12:48
「こう書くことができます」というのは機能を説明しているだけで目的がありませんから、メリットと感じなくて当然ですよ。
あえて書くならば「このように書けること」がメリットです。
まりも
ベテラン
会議室デビュー日: 2006/08/19
投稿数: 77
投稿日時: 2008-06-20 21:04
例が使えないように見えるのは、
プログラムつくる状況があまりないからですかねえ。

そのプログラムが必要になる状況と言うと。
あらゆる電子機器に使える汎用ライブラリでも作るか。
携帯電話が出てくるネットゲームでも作れば使えるかな?

使える局面なら便利だと思いますよ。
たとえば、ネットゲームで、CameraインターフェースのtakePictureメソッドを呼びだしてなにかできるような機能を作ったとします。
写真を撮って画面に表示した上に投稿するとか。

そうすればカメラその機能が使える上に、
その後、ゲームに機能が追加されて、携帯電話が出てきても、そのままその機能が使えます。
それどころか、カメラ付き車が出てこようがカメラ付きかつらが出てこようが、
元の機能を作った人が思いもよらなかったそのアイテムでも、
修正なしにその機能が使えるわけです。





1

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