2009-08-03 11 views
26

抽象クラスまたはインターフェイスクラスを作成する理由、または抽象クラスまたはインターフェイスクラスをいつ使用する必要がありますか?抽象クラスまたはインターフェイスを使用する場合

+1

[Java抽象クラスとインターフェイス]の複製が可能です(http://stackoverflow.com/questions/5094825/java-abstract-class-and-interface) – duffymo

+1

http://stackoverflow.com/questions/761194/interface -vs-abstract-class-general-oo –

+0

https://stackoverflow.com/questions/479142/when-to-use-an-interface-instead-of-an-abstract-class-and-vice-versaには最高のものが含まれています –

答えて

37

インターフェイスは、クラスが持つ必要のあるメソッドとメンバーだけを宣言したいときに使用します。インタフェースを実装する人は、そのインタフェースによってリストされたメソッドを宣言し実装する必要があります。

また、デフォルト実装を使用する場合は、抽象クラスを使用します。抽象クラスを拡張するすべてのクラスは、その抽象メソッドとメンバのみを実装する必要があり、抽象クラスの他のメソッドのデフォルトの実装があります。

--editは - 言及するのを忘れて、エリカーは、あなたが望むよう

最後に、あなたはできるだけ多くのインターフェイスを実装することができますが、唯一の(それは抽象的かどうかである)1つのクラスを拡張することを思い出しました。選択する前にそれを念頭に置いてください。

+2

これは基本的な違いではありません。抽象メソッドしか持たない抽象クラスを作ることができます。 –

+1

この場合、インターフェイスを使用しないのはなぜですか? –

+0

私は言語をデザインしていませんでした! :)理論的には、抽象クラス内のいくつかの保護されたデータフィールドを持つことができます。これは、インターフェースではできません。 –

11

抽象クラスは、そのメソッドの一部を実装していないクラスです。明らかにインスタンス化することはできません。抽象クラスから継承し、抽象メソッドを別のクラスに実装する必要があります。

インターフェイスにはクラスが全くありません(したがって、インターフェイスクラスと呼ばないでください)。インタフェースは実装なしでメソッドのシグネチャを定義します。また、インターフェイスにはメンバフィールドがありません。クラスにインターフェイスを実装する場合は、インターフェイスによって提供されるメソッドの実装を提供する必要があります。

完全に異なる実装を持つことができる、いくつかのものに汎用APIを定義することは理にかなっています。抽象クラスは、主に同じクラスを扱う場合には便利ですが、微妙な違いがあります。両方のアプローチを組み合わせることができます。

良い例は、Javaクラスライブラリのcollections frameworkです。 Listがどのように動作しなければならないかを定義するインタフェースListがあります。いくつかの実装は、例えばArrayListとLinkedListです。同じように動作するので、両方で同じように動作するものは抽象クラスAbstactListに実装され、両方ともこれを継承します。

1

抽象クラスは、継承階層を構築するときに使用されます。しかし、ほとんどの継承階層は、あまりにも深い(つまり、継承レベルがあまりにも高い)べきではありません。多くのオブジェクト指向設計書は、継承よりもインターフェイスを優先しています(これは、「継承は、実装することのない最もクールなオブジェクト指向の機能です」という読者の言葉を引用しています)契約によって "、契約はインターフェイスです。

samuelcarrijoの答えには注意する価値があります。メソッドのデフォルトの実装が必要な場合は、メソッドを実装した抽象クラスを使用する必要があります。このデフォルトの実装は、子クラスでオーバーライドすることができます。

希望すると便利です。

2

SamuelCarrijoこの質問によく答えているようです。

Javaに加えて、一部のフレームワークでは、動作するためのインタフェースが必要です。私は(と)dynamic proxies、またはいくつかのクライアント/サーバープロキシフレームワークを考えています。これは、オブジェクトでイントロスペクションを使用して、オブジェクトによって実装されたインタフェースによって実装されるメソッドを決定するためです。場合によっては、オブジェクトのためのインタフェースを実装しなければならない場合があります。おそらく通常は気にしないでしょう。

この理由は、Java固有のものです。

15

重要な違いは、implement複数のインターフェイスをクラスで使用できますが、1つの抽象クラスはextendのみです。これは、抽象クラスではデータを格納するフィールドを定義できますが、インタフェースでは定義できないためです。

+0

良い点!私はそれを覚えていなかった。 Java(C#のような)では、クラスの多重継承はできませんが、必要な数のインタフェースを実装することができます。 –

+0

実際には、インターフェイスにフィールドを含めることもできますが、静的で最終的な場合にのみ – FearlessHyena

3

「インターフェイス」は基本的に「契約」です。インタフェースを定義しているときに、契約を定義しています。抽象クラスが拡張される場合、インタフェースは実装されます。

例を考えてみましょう。

public interface Friend { 
void hello(); 
} 

は今、あなたは Friendを実装したい任意のクラスはメソッド hello()の定義を提供する必要があると述べている契約を定義しています。

public class myFriend implements Friend { 
public void hello() 
println("Done"); 
} 

myFriend契約を履行しています。ここ

は実装です。ここで問題となるのは、どこのインタフェースを使うべきかということです。

インターフェイスは、実装する必要がある動作を定義するのに役立ちます。いくつかの機能を定義するクラスAがあるとします。特定の動作(メソッド)を定義する場合にのみ、このクラスの機能を他のクラスで使用する必要があります。インタフェースの面でこの制限を適用します。

関連する問題