-PR-
解決済み

interface,extend,implementのちがい

  • 困ってます
  • 質問No.111300
  • 閲覧数1098
  • ありがとう数24
  • 気になる数0
  • 回答数3
  • コメント数0

お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.3
レベル11

ベストアンサー率 61% (157/255)

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。
お礼コメント
noname#1752

とてもわかりやすくて、講義を聴いているようでした。
implementできるクラスはインターフェースだけと言うことでしょうか?

まだまだ勉強不足です。
投稿日時 - 2001-07-31 10:11:36

その他の回答 (全2件)

  • 回答No.1
レベル9

ベストアンサー率 38% (24/62)

いまいち自信が在りませんが・・・

1)はメソッドの名前と変数だけを提供するクラスを作成する時に
 使用するものだと思います。
 例えば、「FileAccess」のインターフェースクラスを作成して、
 メソッドとして「FileRead」と「FileWrite」を用意したとしましょう。
 すると、このインターフェースを実装しているクラスなら、どれでも
 この二つのメソッドを持っている事になるので、そのクラスに対して
 気兼ねなく(?)メソッドの呼出しが出来ます。
  FileAccessインターフェースを実装しているクラスであればどれでも、
 ファイルの読み書きを提供していると言う事になるわけです。
  インターフェースは多くのクラスで共通の関数名を使えるようにするものだ
 と、僕は思っています。(処理の内容自体はクラスによって異なりますが。)

2)の「extend」は親クラスを継承して新しく子クラスを作成する時に
 使用します。文字入力域の子クラスを作成して半角文字しか入力できない
 オリジナルの入力域クラスを作成する時などに使います。

3)の「implement」はインターフェースを実装する時に使うものだと
 思っています。例えば、2)で作成したオリジナル入力域に対して
 「FileAccess」インターフェースを実装すると、
 ファイルの読み書き機能を搭載した半角文字しか入力できないオリジナルの
 入力域を作成する事が出来ます。

以上でどうでしょうか?かなり大まかな説明ですが。
意味不明な部分が在りましたら、補足します。
お礼コメント
noname#1752

ありがとうございました。
ちなみに、JTextFieldを継承した新しい機能を持ったTextFieldを作成するにはどうすればいいのかなあ…
って感じで今悩んでます。
投稿日時 - 2001-07-30 17:23:00


  • 回答No.2
レベル9

ベストアンサー率 38% (24/62)

#1のsueokaです。
自分で読んでいても「分かり難いなあ」とか思ってしまったので、補足です。(笑

1)のインターフェースですが、これは「共通規格」の様な物です。
 例えば「USB」と言う規格(?)がありますが、「USB対応」と言う機器なら
 どのメーカーのでもUSBコネクタに繋げる事が出来ますよね。
 でも、実際にやり取りするデータの中身はどれもこれも違います。
 が、「USBポートを通してデータのやり取りをする」と言う表面上の
 処理名は同じです。その処理方法(データの内容など)が異なっていたりするわけです。
  このインターフェースは個人で小規模のアプリケーションを作成する分には
 考える必要はないと思います。使って直ぐに利便性が得られるものではないと
 思います。良い具体例が思い浮かばないのですが・・・ActionPerformedって
 ありますよね。ボタンクリックした時などにどんな処理をおこなうかを記述する
 部分ですが、何もこのメソッドはボタンだけに在るわけでは在りませんよね。
  色々なコンポーネントがこのインターフェースを実装していて、「ユーザーが
 そのコンポーネントに対してアクションを起こした」と言う共通の動作によって
 呼び出されるメソッドです。そして、VM内部で何かしらのアクションをキャッチした時に
 それが何かを調べる必要が在るわけですが、もしもインターフェースが無い場合には、
 ボタンであるか、コンボボックスであるか、チェックボックスであるかと一つ一つ
 場合分けをしなくてはいけなくなります。後々、コンポーネントの追加をしようと思ったら
 これは大変ですね。でも、ActionListenerインターフェースを実装していれば、
 何のコンポーネントだろうとActionPerformedを呼び出せば良いのです。
  凄い長くなってしまいましたが、「実装元を気にせずに使える関数」
 を宣言する時にインターフェースを使うのではないでしょうか。

2)のextendは親クラスに新しく機能を追加する時に使いますよね。

3)のimplementはインターフェースを実装する時に使います。

長ったらしい補足ですみませんでした。
お礼コメント
noname#1752

なるほど、勉強になります。
ActionPerformedとかはJBUILDERとかを使用しているのでコンポネントのダブルクリックとかで簡単にやってたんですけど。意味わかってなかったかも知れないです。

ありがとうございました。
投稿日時 - 2001-07-30 13:10:54
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-

特集


専門家があなたの悩みに回答!

ピックアップ

ページ先頭へ