2011-06-09 146 views
4

我有几个扩展其他类的类。他们都有一个共同的方法result。如果我有foobarbaz的实例,是否可以调用其父/祖父的result方法?在子类对象上调用父类的方法java

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 
+0

愚蠢的问题,但你有什么工作吗?我看起来好像可能。 – Peaches491 2011-06-09 16:34:59

+0

我不能向你保证。Java有一些沿着动态方法调用的方式,即使你给一只猫贴上标签,然后调用getFood(),它会返回dogFood而不是catFood。 *不要试图把狗当作猫来投放 – 2011-06-09 16:39:14

+0

你试图这样做的事实表明你可能在你的程序中有一个概念缺陷。因此,你应该花时间修复这个概念缺陷,而不是解决问题。无论如何,答案中的示例代码将允许您这样做。 – deadalnix 2011-06-09 16:53:05

回答

1

设计原理:在继承

青睐组成获取Head First设计模式书的副本和阅读有关策略,模板,也许还工厂模式。在那里讨论的其他模式在这个项目或项目中的其他地方肯定会派上用场。

一个可能的场景:

  • 有富,FooBar的和FooBarBaz类从抽象类AbstractFoo扩展
  • 给AbstractFoo型计算器myCalc的属性(和getter和setter去与)
  • 使计算器成为doCalc()方法的接口,由实现此接口的类实现
  • 创建实现其自己版本的doCalc()的所有可能的Calculator实现(CalculatorX,CalculatorY,..)
  • 给AbstractFoo一个公众诠释计算()方法的myCalc.doCalc()方法调用,以获得您所需要

点在哪里,你不用担心不同的计算器实现的结果有共同的代码,您可以使用模板模式或让它们从BaseCalculator等扩展。

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

+0

可以在这里找到书[在这里](http://www.amazon.com/First-Design-Patterns-Elisabeth-Freeman/dp/0596007124)等网上书店。 – Wivani 2011-06-10 09:11:35

0

超级调用父类

2

你需要像这样在每个类的方法:

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

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

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

这是不是真的有可能。您必须实例化父类的对象才能调用其打印方法。

例如

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

只有从子类中可以使用超级关键字来访问超类的方法。

+0

如果方法是静态的,您不必实例化 – Woot4Moo 2011-06-09 16:45:11

+0

@ Woot4Moo True。但是问题中的示例不包含静态方法。 – 2011-06-09 16:48:57