在子类对象java上调用父类的方法

时间:2011-06-09 16:32:13

标签: java oop

我有几个课程可以扩展其他课程。他们都有一个共同的方法result。如果我有foobarbaz的实例,是否可以调用其父/祖父母的result方法?

public class Foo {
    protected int resultA;
    public void calc(){ resultA=...} 
    public void result(){  return resultA;      }
}

public class Foobar extends Foo{
   protected int resultA;
   public void calc(){
       super.calc();
       resultB=...;
   } 
   public void result(){  return resultB;      }
}

public class Foobarbaz extends Foobar{
   protected int resultA;
   public void calc(){
       super.calc();
       resultC=...;
   }
   public void result(){  return resultC;      }
}

我试图解决的问题是每个类除了其父类之外还做一些额外的计算。如果用户想要所有3个对象的结果,则CalculationManager知道只需要输入和计算Foobarbaz。然后它将Foobarbaz的引用返回给任何要求Foo的人,因为Foobarbaz也会为Foo提供结果。

类似的东西:

CalculationManager.add(Foo,Foobar,Foobarbaz);
//The following 3 calls return the same reference to a Foobarbaz object 
Foo       res1=CalculationManager.get(Foo);
Foobar    res2=CalculationManager.get(Foobar);
Foobarbaz res3=CalculationManager.get(Foobarbaz);
CalculationManager.doCalc();
//Iterate over each object to get result with the same method .result()
res1.result();        //---> resultA 
res2.result();     //---> resultB 
res3.result();  //---> resultC 

4 个答案:

答案 0 :(得分:2)

每个班级你都需要这样的东西:

Foo:  
    printParent()  
    {  
       super.printParent();  
    }  

FooBar:  
    printParent()  
    {  
       super.printParent();  
    }  

FooBarBaz:  
   printParent()  
   {  
      print(); // this is the top most class 
      //Incredibly fragile!
   }

答案 1 :(得分:1)

这实际上是不可能的。您必须实例化父类的对象才能调用其print方法。

e.g。

    FooBar f = new FooBar();
    f.print(); //foobar

只能从子类中使用super关键字来访问超类'方法。

答案 2 :(得分:1)

设计原则:赞成合成而不是继承

获取Head First Design Patterns一书的副本,并阅读有关策略,模板以及工厂模式的内容。在那里讨论的其他模式肯定会在这个项目的其他地方或将来的项目中派上用场。

可能的情况:

  • 让Foo,FooBar和FooBarBaz类从抽象类AbstractFoo扩展
  • 给AbstractFoo一个类型为Calculator myCalc的属性(和getter和setter一起使用)
  • 使计算器与方法doCalc()的接口由实现此接口的类实现
  • 创建实现自己版本的doCalc()的所有可能的Calculator实现(CalculatorX,CalculatorY,..)
  • 给AbstractFoo一个public int calc()方法,该方法调用myCalc.doCalc()方法来获得所需的结果

当您担心不同的Calculator实现具有公共代码时,您可以使用模板模式或从BaseCalculator等扩展它们。

这应该会让你忙碌一段时间,但是如果你做得好并掌握它,你会发现使用这样的模式可以帮助你在许多编程环境中。因此我猜名称模式; - )

答案 3 :(得分:0)

super调用父类的方法