質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • Java

    14093questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • オブジェクト指向

    293questions

    オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

インターフェースが、実装されてないクラスやメソッドでは、突然になって変更・拡張することが可能なのか?

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 578

mr0237

score 143

オブジェクト指向を勉強・練習している者です。エンジニアとは関係ないような質問をしてすいませんが、 
インターフェースとは、

定数 メソッド名

↑これのみを定義(記述)しておくことで、

1.処理内容をすぐに追加・変更することができる。
2.探して書き換える手間が省ける。
3.後々変更・追加が予想される場合には便利

と、変更・追加が容易(簡単)になりますが、そこで疑問があるのですが、
インターフェースが、実装されてない

  • クラス
  • メソッド

これらのものは、想定されてなかったものでも突然になって変更・拡張することが可能なんでしょうか?

つまり、将来想定されてなかったもの(インターフェースが全くついていないもの)でも拡張・変更は可能なのか?ということです。

例えると、拡張を前提としていない、1つの部屋があるコンクリートの建物があったとします。
(つまり、インターフェースがついていない、確定されているメソッドやクラス)

イメージ説明

その10年後になって、手狭になったので、そのコンクリート製の建物の構造を拡張して、2つの部屋に改装する。
(つまり、インターフェースがついてない、確定されているメソッドやクラスを元にメソッド等を拡張する。)

イメージ説明

その拡張を前提としていない構造物(インターフェースがついてない、確定されているメソッドやクラス)を10年後になって突然変更はできるんでしょうかということです。

回答のほうお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+6

まずインターフェースの役割についての誤解があるようです。

インターフェースを実装されたクラスは、インターフェースで定義された関数の実装を持つことを約束する

というのが本来の意味になります。

どういうことかというと、例えば乗り物は、「走る」や「止まる」という機能を持ちます。
このことが約束されていれば走り方(ガソリンエンジンで走るや、電気で走る、またはペダルをこぐ)はどのようにしてもよいわけです。

このメソッドの外側から見れば、どうやってやるかは知らなくてもこの乗り物は「走る」ことは約束されているので、実装を知らなくても使用することができます。
ただ、インタフェースにより乗り物は 必ず走るという機能を持つ必要があります。 これが約束になります。

また、関数の実装者から見るとインタフェースで規定されていることにより、新しい乗り物を作るときに必ような機能が明確になるので何を実装するのかがわかります。

質問にある、現在想定されていないものに対して将来機能が必要になった場合ですが
インタフェースを使用するクラスについては、インタフェース側で必要になった機能の定義を増やすことでそれを使用しているクラスすべてに対し拡張された関数の実装が必須となりコンパイルエラーとなります。このため機能の実装漏れができないことを開発者に教えてくれます。

では、インタフェースのないクラスに対して拡張ができないのかというとそんなことはなく自由に拡張ができます。
また、インタフェースがついているクラスについてもインタフェースで定義された関数以外の関数の実装もできます。

【参考】上記拙い説明なので下記サイトを紹介して補足とします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/17 19:24

    すいません。それは上記の例(コンクリート製の建物の構造)に例えると、「インターフェース」とは拡張を前提として建築するものであり、「拡張を前提とされていない」建物を建設することが不可能ということでしょうか?

    キャンセル

  • 2018/06/17 21:02 編集

    インターフェイス自体は機能要件なので建築されません。
    インターフェイスの要件に見合うようにimplementされたクラスを建築(実装)します。

    拡張を前提として建築(実装)しているものはextendsの親クラスになります。

    キャンセル

  • 2018/06/18 02:45

    まず、質問のタイトルに対してシンプルにお答えすると
    「インターフェースが、実装されてないクラスやメソッドでは、突然になって変更・拡張することが可能なのか?」
    に対しては、「可能です」という回答になります。
    クラスに何らかの新たなメソッドを追加することはインタフェースがあっても、なくても自由に行ってもよいのです。

    キャンセル

checkベストアンサー

+1

もう少し mr0237さんの提示された部屋の例えでまとめてみます。
部屋というクラスだと自立した動作がないので若干説明に苦しいところもありますがご容赦ください。

以下のようなイメージで説明します。

  • 「インターフェース」= 「機能要件、建築に関する法令」
  • 「クラス」=「設計図」
  • 「インスタンス」= 「建築された部屋」

 インタフェースを使わない部屋の変更

mr0237さんは部屋が欲しくなったので部屋の 設計図を作成 しました。
 これはJavaでいうと下記のクラスを定義するということです  

// 部屋の設計図
class Room {
   // 部屋の広さを返す関数
   double getSize() {
      return 6; // 6畳
   }
}


この設計図に従って 部屋の建築 を行いました。
 これはJavaでいうとクラスからインスタンスを作成するということです  

// 6畳の部屋を作成する
Room myRoom =  new Room();

このクラス Roomはインタフェースを基にしてはいません。
この部屋にテレビを置く(拡張する)ためには以下のように クラスの設計を変更 します。

// 部屋の設計図
class Room {
   // 部屋の広さを返す関数
   double getSize() {
      return 6; // 6畳
   }
   // テレビを持っている
   boolean hasTelevision() {
      return true;
   }
}


この部屋の広さを6畳から8畳に (変更する) ためには既存 メソッドの実装を変更 します。

// 部屋の設計図
class Room {
   // 部屋の広さを返す関数
   double getSize() {
      return 8; // 8畳
   }
}

上記は、当初 想定されてなかったものでも突然になって変更・拡張する という目的にかなうもので
前のコメントはこのやり方のことを言っています。

「インターフェースが、実装されてないクラスやメソッドでは、突然になって変更・拡張することが可能なのか?」に対しては、
「可能です」という回答になります。

つまりクラスの設計を行う人が何を変更するかがわかっているのであればインタフェースがなくても変更も拡張もしてもよいのです。

 インタフェースを使う場合

部屋を作るうえでは、建築基準法や消防法といった法律があります。これをイメージしてほしいのですが下記のようになります。

interface 建築基準法 {
    // 窓があること
    boolean has窓();
}

// この部屋の設計図は建築基準法にのっとったものです
class Room implements 建築基準法{
   // 部屋の広さを返す関数
   double getSize() {
      return 3.3*6; // 約6畳
   }
  @Overide
   boolean has窓() {
      return true;
   }
}


1年後法令が変更になって消防法を満たす必要が出てきました。

interface 建築基準法 {
    // 窓があること
    boolean has窓();
}
interface 消防法 {
    // 消火器の設置が義務付けられている
    boolean has消火器();
}
class Room implements 消防法, 建築基準法{
   // 部屋の広さを返す関数
   double getSize() {
      return 3.3*6; // 約6畳
   }
   @Overide
   boolean has窓() {
      return true;
   }
}


このとき上記のままですと法令に不適合(コンパイルエラー)になります。

適合させるためには、以下のように設計を変更して法令(インターフェース)で決められたメソッドを実装する必要があります。

class Room implements 消防法, 建築基準法{
   // 部屋の広さを返す関数
   double getSize() {
      return 3.3*6; // 約6畳
   }
   @Overide
   boolean has窓() {
      return true;
   }
   @Overide
   boolean has消火器() {
      return true;
   }
}

また暫くして消防法が変更になり火災報知機の設置が義務付けられました。
 これはJavaでいうとインタフェースにメソッド定義を追加するということです  

interface 消防法 {
    // 消火器の設置が義務付けられている
    boolean has消火器();
    // 火災報知機の設置が義務付けられている
    boolean has火災報知機();
}

このときもクラスRoomは不適合(コンパイルエラー)になりますので適合させるために部屋の設計を変更します。

class Room implements 消防法, 建築基準法{
   // 部屋の広さを返す関数
   double getSize() {
      return 3.3*6; // 約6畳
   }
   @Overide
   boolean has窓() {
      return true;
   }
   @Overide
   boolean has消火器() {
      return true;
   }
   @Overide
   boolean has火災報知機() {
      return true;
   }
}


このように法令(インタフェース)に沿った設計(クラス)の部屋ですが、設計者がベランダを追加したいと思った場合はインタフェースに追加しなくても設計(クラス)に追加することが可能です。
(ベランダがなければならないという法令はないので...)

class Room implements 消防法, 建築基準法{
   // 部屋の広さを返す関数
   double getSize() {
      return 3.3*6; // 約6畳
   }
   boolean hasベランダ() {
      return true;
   }
   @Overide
   boolean has窓() {
      return true;
   }
   @Overide
   boolean has消火器() {
      return true;
   }
   @Overide
   boolean has火災報知機() {
      return true;
   }
}

どうでしょうか?伝わりますでしょうか?

 コメントへの回答

それは上記の例(コンクリート製の建物の構造)に例えると、「インターフェース」とは拡張を前提として建築するものであり、「拡張を前提とされていない」建物を建設することが不可能ということでしょうか?

今回私は「拡張」という意味を「継承」とは違うものとして理解して説明をしています。

「拡張を前提とする、しない」ということを気にしておられるようですね、私の知る限り 拡張、変更できないクラスというのは言語仕様(Javaでの話をしてしまいますが)としては存在しないと思います。すべてのクラスは拡張も変更もできます。(クラス定義を変更するだけなので)

言い換えると

「インターフェース」とは設計に一定の基準を定めるものであり、「要件を満たさない」設計をすることができないよう使用されるもの

となります。

質問の内容を改めて見直してみると

インターフェースとは、

  1. 処理内容をすぐに追加・変更することができる。
  2. 探して書き換える手間が省ける。
  3. 後々変更・追加が予想される場合には便利

ここで書かれている内容においては インタフェースというより継承によるメリットを表しているように思われます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/22 22:06

    すいません。それは言い換えると「インターフェース→基準(ルール)を定める」もので
    あり、「ルール(規格)を強制できる(ルール違反できない)」ようにするということなんでしょうか?

    キャンセル

  • 2018/06/22 22:39

    そういう理解でいいと思います。外部からの呼び出しに対して、最低限必要なメソッドについてのInput・Outputの形を強制することです。
    中のロジックの実装方法について決めるものではないですし、別のメソッドを追加しても構いません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    指定した大きさでマス目が作成できない。

    前提・実現したいこと 1マスが100×100ピクセルで、3(横)×5(縦)のマス目で、 画像サイズもそのマス目全体にピッタリのものを作成しようと考えています。 これを長方

  • 解決済

    Scene BuilderでCSSファイルと画像ファイルを読み込んだが、NetBeans上で反映され...

    Scene BuilderでCSSファイル読み込んで、ボタンが平面的になるボタンを作成し、 画像をファイルから読み込んで挿入し、Scene Builderでプレビューすると↓のよ

  • 解決済

    ACCESS クエリでの一部重複?の除外方法について

    前提・実現したいこと こんにちは、質問タイトルが適格でないかもしれませんが宜しくお願いいたします。 通販事業をしており、商品の仕入から販売までのデータベースをACCESSの

  • 解決済

    Monacaでtimepickerの実装

    前提・実現したいこと MonacaでiOS/Andriod両方に対応しているアプリケーションを開発していて、アラーム機能を実装しようと思い、Monacaでtimepickerのよ

  • 解決済

    pandasで多次元配列を管理するには

    L次元のベクトルxがi,j,kをパラメータにして生成されるとき, 列にXベクトルの成分をならべ,インデックスをi,j,kの組み合わせで表示したいです. (以下のような生成過程の

  • 解決済

    atom自動補完やり方

    これのプログラミング版になります 今いろいろ調べているのですが、atom自動補完ができません。宜しくお願い致します。 リンク内容 autocomplete-p

  • 受付中

    ER図について

    つぶやきアプリを作っているのですが、 ER図を作るとする例えばどんなものがありますか?? サンプル程度でいいので教えていただきたいです

  • 受付中

    tableのレスポンシブ対応

    レスポンシブした際に、iphoneのsafariでtableのthとtdをdisplay:block;にし、width:100%;を指定しているのですが、td要素のみ画面幅いっぱい

同じタグがついた質問を見る

  • Java

    14093questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • オブジェクト指向

    293questions

    オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

  • トップ
  • Javaに関する質問
  • インターフェースが、実装されてないクラスやメソッドでは、突然になって変更・拡張することが可能なのか?