インターフェースと抽象メソッドの違いがよくわからないのですが、
抽象クラスは多重継承できないので、複数のクラスのメソッドを使いたいときのために
インターフェースを用意して、子クラスで抽象クラスの継承とインターフェースの実装を
同時に行う。
これがインターフェースを定義する意味だという認識でよろしいでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/03 10:53
回答3件
0
これがインターフェースを定義する意味だという認識でよろしいでしょうか?
抽象クラスやインターフェイスを定義することで一番おいしいのは、ポリモーフィズムが使えることです。
抽象クラスは性質を他のオブジェクトに引き継がせる機能であり、
インターフェイスは共通の振る舞いを他のオブジェクトに持たせる機能です。
抽象クラスはis-a
関係を作るための機能であり、
インターフェイスはcan-do
関係を作るための機能です。
例えば、ToggleButton is a Button, and FlatButton is a Button
という関係を明示するときはToggleButton
とFlatButton
クラスにButton
クラスを継承させます。
例えば、ToggleButton can be pushed, and FlatButton can be pushed
という関係を明示するときはToggleButton
とFlatButton
クラスにPushable
インターフェイスを実装させます。
もちろん、Button
という抽象クラスを定義して、Button can be pushed
という関係を明示するためにButton
にPushable
を実装しても構いません。
実際に何の意味があるのか
最初にも書きましたが、ポリモーフィズムを使えることが一番おいしいのです。
is a button
なオブジェクトまたは、またはcan be pushed
なオブジェクトなら特定の処理をしたいというケースがあります。
その場合はインターフェイスの型や抽象クラスの型を引数に取り、プログラムを書くことができます。
Java
1public class Main { 2 public static void main(String[] args) throws Exception { 3 Button tb = new ToggleButton(); 4 Button fb = new FlatButton(); 5 getButtonIsEnabled(tb); 6 getButtonIsEnabled(fb); 7 pushSomething(tb); 8 pushSomething(fb); 9 } 10 11 public static void getButtonIsEnabled(Button b){ 12 System.out.println(b.getEnabled()); 13 } 14 15 public static void pushSomething(Pushable p){ 16 p.push(); 17 } 18}
Java
1public abstract class Button implements Pushable{ 2 private boolean enabled = true; 3 public abstract void push(); 4 5 public boolean getEnabled(){ 6 return this.enabled; 7 } 8 9 public void setEnabled(boolean enabled){ 10 this.enabled = enabled; 11 } 12}
Java
1interface Pushable{ 2 void push(); 3}
上記のように書くことで、引数に渡されたインスタンス毎の状態を取得したり、インスタンス毎に違う振る舞いをさせたりすることができます。
これがポリモーフィズム(多態性)です。
後でDecorativeButton
という新しいクラスを追加したいという時になっても、そこにButton
クラスを継承させたり、Pushable
インターフェイスを実装させたりすることですぐにアプリケーションへ組み込むことが出来ます。
投稿2020/02/02 07:41
編集2020/02/04 05:19総合スコア2663
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/04 00:23
2020/02/04 04:59 編集
0
C++ では多重継承と言って、複数の親を継承する事ができます。しかしこれには次のようないくつかの問題があります。
その問題をクリアできるのがインターフェースです。
しかしインターフェースには実装が無いため、同じコードを使い回すことができません。それでは不便なのでクラスを継承することができるようになっています。
つまり、クラスを継承するのはコードを継承するためです。
これは抽象クラスでも同じです。抽象クラスには特定のパブリックメソッドの実装は無いかもしれませんが、実装されたパブリックメソッド、実装されたプライベートメソッド、実装されたインスタンス変数を持つことができます。
要するに使い分けとしては、まずインターフェースを検討し、コードを使い回したい時に抽象クラスを使うようにすればいいと思います。
概念的には、インターフェースは他のクラスからそのクラスを使うための骨組みであり、抽象クラスは、子クラスがどのように親クラスを継承するかの骨組みです。
また、ある時には継承よりも委譲・合成を選択すべき場合もあります。その時にもインターフェースは力を発揮するでしょう。
投稿2020/02/02 07:20
編集2020/02/02 07:38総合スコア28669
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
インターフェースは API (Application Program Interface) のように外部公開する仕様を記述。
抽象クラスは、クラス内で使う内部実装。
抽象クラスは、フレームワークやデザインパターン化されているような実装に使うといいです。
抽象クラスを使う場合でも、インタフェースを使って外部公開するメソッドを明示すべきです。
ソフトウェアだけでなくハードウェアでも同じ考え方ができますよ。
例えば、テレビとかHDDレコーダーとか、内部は複雑な構造をしてますが、筐体の中に実装を閉じ込めて(カプセル化して)見えないようにし、前面には「操作インタフェース」、背面には「接続インタフェース」を出して(公開して)、マニュアルにユーザインタフェースの使い方が書いてあります。
筐体内部では共通化・プラットフォーム化・フレームワーク化した部品や配線でHDD容量の違う機種を製品化してたりします。
ユーザは、機種が違っても同じ使い方ができて嬉しいですよね。別メーカーの別の機種でも、インタフェースが同じなら買い替え・入れ替えても問題なく使えます(ポリモーフィズム)
ソフトウェアも独立性を高めて部品化し、部品と部品を線で繋ぐだけで動作するようなプログラミング時代に突入していて、小学生たちがすでに使いこなしてたりします。
投稿2020/02/02 07:12
編集2020/02/02 07:51総合スコア5406
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。