我有一个类,它扩展了我需要覆盖的类,但我需要调用该类的父类。既然我不能打电话给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 */ }
}
答案 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