11

私はインターフェースが関係しているときの継承を理解しようとしてきました。サブクラスが次の場合にどのように作成されるかを知りたいです。

たとえば、私が持っているとしましょう:

  1. インターフェイスIを実装するスーパークラス
  2. スーパークラスAを拡張するいくつかのサブクラス

私の質問

  1. Aを拡張するすべてのサブクラスでインターフェースメソッド「qおよびr」の実装を提供する必要がありますか?

  2. サブクラスでインターフェイスの実装を提供しない場合、そのサブクラスを抽象クラスにする必要がありますか?

  3. サブクラスのいずれかがIを実装することは可能ですか?たとえば、クラスCはAを拡張し、Iを実装しますが、これは可能ですか?私を実装するスーパークラスをすでに拡張しているのに?

  4. インターフェイスIからメソッドrの実装を提供しないとすると、スーパークラスAと抽象クラスを作成する必要があります。あれは正しいですか?

私のサンプルコード:

    //superclass
    public class A implements I{
    x(){System.out.println("superclass x");}
    y(){System.out.println("superclass y");}
    q(){System.out.println("interface method q");}
    r(){System.out.println("interface method r");}
    }

    //Interface
    public Interface I{
    public void q();
    public void r();
    }

    //subclass 1
    public class B extends A{
    //will i have to implement the method q and r?
    x(){System.out.println("called method x in B");}
    y(){System.out.println("called method y in B");}
    }

    //subclass 2
    public class C extends A{
    //will i have to implement the method q and r?
    x(){System.out.println("called method x in C");}
    y(){System.out.println("called method y in C");}
}
4

4 に答える 4

8

1)いいえ、サブクラスでメソッドを実装する必要はありません。サブクラスはすでにスーパークラスで定義されているためです。サブクラスは、これらのメソッド定義を継承します。

2)いいえ、1を参照してください。唯一の例外は、スーパークラスが抽象でインターフェイスを実装していない場合です。サブクラスが抽象でない場合は、サブクラスに実装する必要があります。

3)いいえ。正しくコンパイルされる可能性がありますが、効果がないため、実行しないでください。

4)はい、これは正しいです。インターフェイスからメソッドを実装しない場合は、クラスを抽象化する必要があります。

于 2012-10-30T00:34:21.043 に答える
1

抽象クラスのみがそれらを抽象に保つことができます。つまり、インターフェースのメソッドの実装を提供するために抽象クラスは必要ありません。

Aは具体的であるため、実装を提供する必要があります。次に、のサブクラスは、Aからそれらの実装を継承しAます。

ただし、A抽象的でメソッドの実装を提供しなかった場合は、実装を提供する必要がBありCます。

于 2012-10-30T00:36:15.880 に答える
1

1:いいえ、スーパークラスに実装する場合は、サブクラスに実装する必要はありません。

2:スーパークラスのメソッドを実装しない場合は、それを抽象化してから、具象サブクラスにそれらのメソッドを実装させる必要があります。

3:はい。ただし、スーパークラスはすでにthrmを実装しているため、完全に冗長です。

4:はい、スーパークラスを拡張するときに、これらのメソッドをクラスに実装する必要があります

于 2012-10-30T00:36:58.213 に答える
0

インターフェースは、「これらのメソッドを提供できる」という外の世界への約束です。

1)と2)と4)スーパークラスAはすでにインターフェースIを実装しているので、外の世界を約束しました。スーパークラスAは、次の方法でその約束を果たすことができます。

  • メソッドの実装-この場合、サブクラスはすでにそのメソッドを継承しており、何も実装する必要はありません。
  • 自分自身を抽象として宣言する-この場合、サブクラスは抽象メソッドを実装するか、自分自身も抽象として宣言して、サブクラスを拡張するクラスに「お金を渡す」必要があります。

3)スーパークラスAのすべてのサブクラスは「約束」を継承するためすでにIを実装しているため、クラスCはAを拡張します。Iは冗長です。

于 2012-10-30T00:38:13.127 に答える