web-dev-qa-db-ja.com

Java祖父母のメソッドを呼び出す方法は?

重複の可能性:
なぜsuper.super.method(); Javaでは許可されないのですか?

ABCの3つのクラスがあり、それぞれが前のクラスを拡張していると仮定します。

BmyMethodも実装している場合、A.myMethod()からC.myMethod()のコードを呼び出すにはどうすればよいですか?

class A
{
  public void myMethod()
  {
    // some stuff for A
  }
}

class B extends A
{
  public void myMethod()
  {
    // some stuff for B
    //and than calling A stuff
    super.myMethod();
  }
}

class C extends B
{
  public void myMethod()
  {
    // some stuff for C
    // i don't need stuff from b, but i need call stuff from A
    // something like: super.super.myMethod(); ?? how to call A.myMethod(); ??
  }
}
24
Arkaha

できません。これは意図的なものです。

クラスBは、サブクラスへのインターフェース(概念のように、Javaキーワードではない)を提供します。A.myMethodの機能に直接アクセスしないことを選択しました。 。その機能を提供するためにBが必要な場合は、別の方法を使用します(別の名前、protectedにします)。ただし、「継承よりも構成を優先する」方がおそらく良いでしょう。

18

あなたはできません、そしてあなたはすべきではありません。

これは悪いデザインの兆候です。メソッドの名前を変更するか、必要な共通機能を別のメソッドまたはユーティリティクラスに含めます。

2
Bozho

できるかわかりません。 Javaは、デフォルトですべてのメソッドを仮想化します。これは、最も単純なソリューションが機能しないことを意味します。タイプAの変数を宣言し、Cインスタンスをに割り当てます。それを呼び出してmyMethodを呼び出すと、C.myMethodが呼び出されます。

Aを反映して、そのメソッドを直接呼び出すことができます。この場合に何が起こるかを見るのは興味深いですが、仮想ディスパッチが起こらないとしたら驚きます...

0
Daren Thomas