すでに抽象クラスを指定しているのに、なぜインターフェイスを使用するのですか?
interface A {
void show();
}
class TestA implements A {
public void show(){}
}
abstract class B {
abstract void show();
}
class TestB extends B {
public void show(){}
}
すでに抽象クラスを指定しているのに、なぜインターフェイスを使用するのですか?
interface A {
void show();
}
class TestA implements A {
public void show(){}
}
abstract class B {
abstract void show();
}
class TestB extends B {
public void show(){}
}
インターフェイスと抽象クラスは、インターフェイスが動作を記述するという点で異なりますが、抽象クラスは部分的な実装を定義します。インターフェイスには、オブジェクトがどのクラスから継承するかに関係なく、必要なメソッドを提供する任意のオブジェクトによって実装できるという利点があります。
抽象メソッドは通常、部分的な実装を提供するために使用されます。例として、List コレクションの動作を定義する List インターフェースが挙げられます。これは、List の実装を容易にするために、ほとんどの List 実装で必要とされるいくつかのメソッドを提供する AbstractList とは対照的です。リストは AbstractList から継承する必要はありませんが、多くの実装では必要ですが、リストを使用するコードは、使用する実装が AbstractList を拡張するかどうかを気にする必要はありません。
インターフェイスの代わりに抽象クラスを使用する人もいますが、これは一般的にアンチパターンと見なされます。
なぜなら、Abstract クラスは非抽象メソッドを持つことができるため、非抽象メソッドでコードを再利用できるからです!