26

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

、および の3 つのクラスABありC、それぞれが前のクラスを拡張しているとします。

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

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(); ??
  }
}
4

3 に答える 3

20

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

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

于 2010-04-06T11:26:18.467 に答える
2

できませんし、すべきではありません。

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

于 2010-04-06T11:28:46.290 に答える
0

できるかどうかわかりません。Java は、デフォルトですべてのメソッドを仮想化します。これは、最も単純な解決策がうまくいかないことを意味します: type の変数を宣言し、インスタンスをそれAに割り当て、 callが呼び出されるという結果になります。CmyMethodC.myMethod

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

于 2010-04-06T11:27:12.470 に答える