-1

次のインターフェースと抽象クラスの違いは何ですか?

 public interface MyInterface
{
  public int get1();
  public int get2();
  public int get3();
}

public abstract class MyAbstract
{
public abstract int get1();
public abstract int get2();
public abstract int get3();
}

インタビュアーは次の答えに納得していませんでした。彼は何か他のことを聞きたかったのです。

  1. MyAbstractを拡張する必要があり、それ以上拡張することはできませんが、MyInterfaceを実装する場合は、継承を受け入れることができます。

  2. 「implementsMyInterface」を使用する場合は、3つのメソッドすべての実装を提供する必要がありますが、「extends MyAbstract」の場合は、抽象性を引き継ぐことができます。

  3. 設計の観点:すべてのライブラリは抽象クラスではなくインターフェイスで動作します。将来いつでもライブラリのメソッドで使用できるクラス(MyInterfaceを実装)を作成できるように、インターフェイスを使用することをお勧めします。(基本的にポイント1と同じ)

他に何がありますか?インターフェイス/抽象クラスなどの変数には関心がありません。どちらを使用するかを決定するにはどうすればよいですか?

4

3 に答える 3

3

2つのクラス間の関係が非常に確実に「is-a」関係である場合、抽象クラスを使用する場合があるかもしれません。

すべてのサブクラスに共通の「デフォルトの動作」がある場合は、抽象基本クラスを使用する場合のさらに強力なケースがあります。

ただし、一般に、インターフェイスを使用できる場合は、おそらくインターフェイスを使用する必要があります。

私見では...

于 2012-05-22T07:11:37.840 に答える
0

abstractすべてのメソッドでクラスを使用する意味はありませんabstract。これは本質的にインターフェイスです。いくつかの共通のベースロジック(抽象メソッドだけでなく実際のコード)がある場合は、abstractクラスを宣言し、場合によってはを実装しinterfaceます。

于 2012-05-22T07:06:50.677 に答える
0

入れるべき共通コードがない場合は、インターフェイスを選択します。サブクラスを介して共有できるものがある場合のみ - はい、抽象クラス (テンプレート パターン) を使用します。

そして、いつでもインターフェースを持つことができ、それは抽象クラスとしてのサブクラスです。

トップレベルでインターフェイスを使用します。実装する必要があるすべてのメソッドをそこに移動します。実装ではなくインターフェイスを使用したプログラム。実装には変更する機会が多く、インターフェースは少なくなります。

于 2012-05-22T07:30:16.670 に答える