调用父类';子类对象java上的s方法

调用父类';子类对象java上的s方法,java,oop,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{ protec

我有几个扩展其他类的类。它们都有一个共同的方法
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 

super调用父类的方法

在每个类中都需要类似的内容:

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

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

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

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

e、 g

只有在子类中才能使用super关键字访问super类的方法。

设计原则:支持组合而不是继承

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

可能的情况:

  • 让Foo、FooBar和FooBarBaz类从抽象类AbstractFoo扩展
  • 给AbstractFoo一个类型为Calculator myCalc的属性(以及getter和setter)
  • 使计算器成为具有方法doCalc()的接口,该方法将由实现此接口的类实现
  • 创建所有可能的计算器实现(CalculatorX,CalculatorY,…),实现自己版本的doCalc()
  • 为AbstractFoo提供一个公共int calc()方法,该方法调用myCalc.doCalc()方法以获得所需的结果
当您担心不同的计算器实现有共同的代码时,您可以使用模板模式,或者让它们从BaseCalculator等扩展


这会让你忙上一段时间,但是如果你做得好并且掌握了窍门,你会发现使用这样的模式在很多编程情况下都会有所帮助。因此,我想命名模式;-)

这是个愚蠢的问题,但你的东西有用吗?我看可能吧。我可以向你保证,不会的。Java有一些类似于动态方法调用的东西,也就是说,即使您将狗标记为猫,然后调用getFood(),它也会返回dogFood而不是catFood*不要试图把一只狗当一只猫。事实上,你正试图这样做,这表明你的程序中可能有一个概念上的缺陷。因此,你应该花时间修复这个概念上的缺陷,而不是绕开它。无论如何,答案中的示例代码将允许您这样做。如果这是对Java面向对象编程的调查,那么我认为您已经得到了大量的响应,让您忙得不可开交;-)如果你想解决现实生活中的问题,最好向我们详细介绍一下。可能还有其他方法可以实现您想要实现的目标(实现一个接口、一些设计模式等等)instantiate@Woot4Moo对。但问题中的例子不包括静态方法。这本书可以在其他在线书店中找到。
    FooBar f = new FooBar();
    f.print(); //foobar