Java:如何访问两个级别的父类方法?

时间:2010-06-25 12:44:50

标签: java inheritance

我有一个类,它扩展了我需要覆盖的类,但我需要调用该类的父类。既然我不能打电话给super,因为那会执行直接父母什么是获得父类父母的最佳方式?

我确信这是一个基本问题,但是我已经做了一段时间,因为我已经做了一段时间了。

class A
{
 public void myMethod()
 { /* ... */ }
}

class B extends A
{
 public void myMethod()
 { /* Another code */ }
}

class C extends B
{
 I need to call Class A here
 { /* Another code */ }
}

6 个答案:

答案 0 :(得分:30)

你没有:它违反了封装。

可以这么说,“不,我不想要我自己的行为 - 我想要父母的行为”,因为假设你只有在正确维护自己的状态时才这样做。

但是,你无法绕过父母的行为 - 这会阻止它强制执行自己的一致性。如果父类想要允许你直接调用祖父表法,它可以通过一个单独的方法公开...但这取决于父类。

答案 1 :(得分:9)

你不能因为它被B覆盖了.C里面没有A的实例。

问题是你要调用A类的方法,但是从哪个实例?你已经实例化了C,它是一个带有两个自己和继承方法的类。如果B重写了A的方法,你就无法从C访问它,因为方法本身属于C(不是方法) B,它已被继承,现在它在C)

可能的解决方法:

B不会覆盖myMethod()

C接收A的实例并将其保存为类属性。

A中的

myMethod()是静态的,您使用A.myMethod()(我不推荐)

答案 2 :(得分:6)

你所问的是不好的做法,你所说的是C不是B,而是A.你需要做的是让C继承A.然后你可以打电话给super。

如果不是这是唯一的方法......

public String A()
{
String s = "hello";
return s;
}

public String B()
{
String str = super.A();
return str;
}

public String C()
{
String s = super.B();
return s;
}

答案 3 :(得分:1)

除了pakore回答的问题之外,如果对您有效,您还可以链接super.myMethod()次来电。您将从B中的myMethod()致电A myMethod()

class A {
   public void myMethod() {
     ....
   }
}

class B extends A {
   public void myMethod() {
     ....
     super.myMethod();
     ....
   }
}

class C extends B {
  public void myMethod() {
    ....
    super.myMethod(); //calls B who calls A
    ....
  }
}

你最终会从A调用myMethod,但间接地......如果这对你有效。

答案 4 :(得分:0)

您不能直接调用A的方法。在我遇到这种情况的少数情况下,解决方案是在A中添加一个方法来公开它的实现。 E.g。

class A
{
   public myMethod() {
        doAMyMethod();
   }

   void doAMyMethod() {
      // what A want's on doMyMethod, but now it's available
      // as a separately identifiable method
   }
}

class C extends B
{
   public void someStuff() {
      this.doAMyMethod();
   }
}

该方案将公共接口(doMyMethod)与实现(doAMyMethod)分开。继承确实依赖于实现细节,因此这并不严格如此糟糕,但如果可能的话,我会尽量避免它,因为它在A和C中的实现之间创建紧密耦合。

答案 5 :(得分:0)

我为这个案子做的是:

在C类中创建A类的对象并访问其中的A类。 这个例子阐明了更多细节:

class A{
int a;
}
class B extends A{
int a;
}
class C extends B{
int a; 
A obj = new A();
public void setData(int p,int q, int r) {

 this.a = p; //  points to it's own class
 super.a = q;// points to one up level class i.e in this case class B
 obj.a = r; // obj points the class A
}
 public void getData() {
    System.out.println("A class a: "+ obj.a);
    System.out.println("B class a: "+ super.a);
    System.out.println("C class a: "+this.a);
 }
}

public class MultiLevelInheritanceSuper {

 public static void main(String args[]){
    C2 obj = new C2();
    obj.setData(10, 20, 30);
    obj.getData();

 }

}

此示例的输出为:

A class a: 30
B class a: 20
C class a: 10