我有几个课程可以扩展其他课程。他们都有一个共同的方法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
答案 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一书的副本,并阅读有关策略,模板以及工厂模式的内容。在那里讨论的其他模式肯定会在这个项目的其他地方或将来的项目中派上用场。
可能的情况:
当您担心不同的Calculator实现具有公共代码时,您可以使用模板模式或从BaseCalculator等扩展它们。
这应该会让你忙碌一段时间,但是如果你做得好并掌握它,你会发现使用这样的模式可以帮助你在许多编程环境中。因此我猜名称模式; - )
答案 3 :(得分:0)
super调用父类的方法