26

可能重复:
为什么是 super.super.method(); 在 Java 中不允许?

假设我有 3 个类AB并且C,每个类都扩展了前一个类。

我如何A.myMethod()C.myMethod()if Balso implements中调用代码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(); ??
  }
}
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,将您的C实例分配给它,然后 callmyMethod将导致C.myMethod被调用。

您可以尝试反映类型A并直接调用其方法。看看在这种情况下会发生什么会很有趣,但如果虚拟调度不会发生,我会感到惊讶......

于 2010-04-06T11:27:12.470 回答