抽象クラスに対するインターフェースの利点は何ですか? 質問する

抽象クラスに対するインターフェースの利点は何ですか? 質問する

Java では、抽象クラスは具体的なメソッドと抽象メソッドの両方を定義する機能を提供しますが、インターフェースは抽象メソッドを実装する機能のみを提供します。サブクラス/実装でメソッドをオーバーライドすることはどちらの場合も可能だと思いますが、一方が他方よりも実際に優れている点は何でしょうか (Java のインターフェースと抽象クラス)?

ベストアンサー1

インターフェースは、「どのように行うかは気にしないが、実行する必要があることはこれです」と伝えたいときに使用します。

抽象クラスは、「何をすべきかわかっており、いくつか/多くのケースでそれをどのように行うべきかもわかっています」と言いたいときに使用します。

抽象クラスには重大な欠点がいくつかあります。たとえば、

class House {

}

class Boat {

}

class HouseBoat extends /* Uh oh!! */ {
    // don't get me started on Farmer's Insurance "Autoboathome" which is also a helicopter
}

インターフェース経由でアクセスできます:

interface Liveable {

}

interface Floatable {

}

class HouseBoat implements Liveable, Floatable {

}

さて、抽象クラスも非常に便利です。たとえば、AbstractCollection クラスを考えてみましょう。これは、やなど、すべてのコレクションに共通するメソッドのデフォルトの動作を定義しますisEmpty()contains(Object)必要に応じてこれらの動作をオーバーライドできますが、コレクションが空かどうかを判断する動作は本当に変更される可能性がありますか? 通常は、になりますsize == 0。(ただし、大きな違いが生じる可能性があります。サイズの計算にはコストがかかる場合がありますが、何かが空かどうかを判断するのは、最初の要素を確認するのと同じくらい簡単です。)

また、頻繁に変更されることはないため、その「解決済み」カテゴリのすべてのメソッドに対して、毎回そのメソッドを実装するのに開発者の時間を費やす価値が本当にあるでしょうか。変更が必要になったときに、すべての場所で再実装しなければならないと、コードが重複したり、バグを見逃したりすることになります。

おすすめ記事