0

テストで間違えた問題を理解しようとしている:


継承はインターフェイスの実装とどう違うのですか?

  1. 継承により、クラスはそのスーパークラスから動作を取得します。
  2. インターフェイスを使用すると、クラスは実装するインターフェイスから動作を取得します。(これは私が選んだものです)
  3. 継承では、クラスはそのスーパークラスによって定義されたメソッドを実装する必要があります。
  4. インターフェイスを使用すると、クラスは、実装するインターフェイスからインスタンス変数と動作の両方を取得します。

私が考えていた方法は、インターフェイスが動作を定義し、スーパークラスが特性を定義するということです...またはそれらは同じですか? それとも、私の理解が完全に後退していますか?


編集:インターフェースと継承の違いを知っていることを明記する必要があると思います。私は、ビヘイビアーという用語を使用する2つのオプションについて疑問に思っています。教授が専門用語についてつまらなかったのか、それとも質問の仕方が悪かったのかはわかりません。

インターフェイスを実装するときは、インターフェイスで定義されているすべてのメソッドを実装する必要があることを知っています。そのため、インターフェイスはクラスが持たなければならない動作を定義すると思いますが、別のスーパークラスを拡張します (ただし、いくつかの動作を定義します (サブクラスにより多くの動作を与えることができます))。動作を定義するインターフェイス. クラスがインターフェイスを実装する場合、特定の動作があることを確認できます。

おそらく、質問は、インターフェイス自体に動作のコードがあるかどうか、またはそれが単なる定義であるかどうかを尋ねることを意図していたのかもしれません-そのように表現されていれば、答えを知っていたでしょう.

4

7 に答える 7

2

あなたの誤解のいくつかは、純粋にセマンティクスに起因する可能性があると思います。おそらく、インターフェースを説明するより簡単な方法は、API を定義するが、その API の実装を提供しないということです。1 つの注意点は、例として Java を使用することですが、C++ のような言語では、インターフェイスの実装は特別な種類の継承、つまり純粋仮想関数で構成されるクラスからの継承です。

たとえば、Java では、次のように定義された EventListener インターフェースがある場合があります。

public interface IEventListener {
    public void handleEvent(Event event);
}

インターフェイスは、質問の言い回しを使用するために、IEventListenerインターフェイスを実装するクラスがイベントを受信したときにどのように動作するかについて何も言いません。このインターフェイスを実装するクラスが、イベントを受信できるという特性を持つことを保証するだけですイベントを入力します。

一方、継承では、スーパークラスも動作 (実装) を継承できます。たとえば、次の Java 基本クラスを考えてみましょう。

public abstract BaseClass {
    public void baseMethod(int value) {
        System.out.println(int);
}

public class SubClass extends BaseClass {
}

BaseClass から継承するすべてのクラスは、BaseClass の API (特性) と実装 (動作) の両方を取得します。つまり、特性である instanceOfSubClass.baseMethod(1) を呼び出せるだけでなく、そうすると、BaseClass で定義された動作、つまり 1 がコンソールに出力されます。

したがって、インターフェイスは動作(実装)のみを指定せず、API(特性)のみを指定するため、答え(2)は正しくありません。継承は両方を処理できます。

質問のポイントは、API だけでなく動作を共有したい場合に継承が特に役立つことを説明することだと思います。とはいえ、実装 (動作) はコンポジションによって共有することもでき、そのような戦略の方が優れていることがよくあります。優れた議論については、Bloch の効果的な Java の項目 16 を参照してください。

于 2012-12-08T02:53:00.047 に答える
2

インターフェイスを実装するときは、必ずしも実装を気にする必要はありません。また、インターフェイスはコントラクトのみを指定するだけで、コントラクトを実行する方法を指定しないため、必要な数のインターフェイスを実装できることも覚えておいてください。インターフェイスの作成者は、それを処理できます。

オブジェクトを拡張するときは、通常、既存のオブジェクトがすでに大部分を占めている機能が必要なためですが、必要なのはその少しだけです。または、既存のオブジェクトの既存の動作の一部を再定義したい場合。

答えを教えてください: 1 が正しいです。スーパークラス (継承) のメソッドを実装する必要はありません。このスーパークラスの次のサブクラスが (インターフェースのように) メソッドを実装する必要があるのは、抽象の場合のみです。

于 2012-12-08T02:05:43.197 に答える
0

x インターフェイスを実装するオブジェクトは、インターフェイスの定義にリストされているすべてのアクション (メソッド) を実行する必要があることをオブジェクトに伝えます。したがって、x を実装するオブジェクトでは、すべてのアクションを実装する必要があります。インターフェイスはインスタンス化できません。

ただし、オブジェクト y から継承する場合、オブジェクト y には既にいくつかのアクションが実装されている場合があります。そうでない場合、メソッドは (Java で) 抽象としてマークされ、継承されたオブジェクトに実装する必要があります。

于 2012-12-08T02:08:50.383 に答える
0

これは、Java の OO 設計に関する非常に一般的な質問です。

このトピックについてよく説明しているこの非常に優れた記事を心からお勧めします

http://www.javaworld.com/javaqa/2001-04/03-qa-0420-abstract.html

于 2012-12-08T02:15:36.277 に答える
0

正解は 1 です。選択した答え (オプション 2) は間違っています。インターフェイスには技術的に動作がないためです。それらは単なる抽象メソッドのリストです。これらは、クラスのベースとなるテンプレートと見なすことができます。たとえば、プロジェクトが 2 つの部分に分割され、最後に統合する必要があるとします。各チームは、共通のインターフェイスを使用してクラスのベースにすることができるため、統合がはるかに簡単になります。

于 2012-12-08T02:16:24.993 に答える
0

継承すると、猫が得られます。インターフェイスを使用すると、猫の骨格が得られます。

于 2012-12-08T02:17:37.267 に答える
0

継承から動作と実装を取得します。サブクラスは、そのスーパークラスから非コンストラクターおよびプライベート メソッドをすべて継承することに注意してください。これは、特定のメソッドの機能 (実装) を継承できることを意味します。

実装すると、ただの振る舞いが得られます。実装で行っていることは、実装されたクラスまたはインターフェイスで定義されたすべての抽象メソッドをオーバーライドすることを約束するという、コンパイラとの契約に署名することだけです。

これが役に立ったことを願っています。

于 2012-12-08T02:20:03.670 に答える