【问题标题】:call parent class's method on a child class object java在子类对象java上调用父类的方法
【发布时间】:2011-06-09 16:32:13
【问题描述】:

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

【问题讨论】:

  • 愚蠢的问题,但你有什么工作?我看起来可能会。
  • 我不能向你保证。 Java 有一些类似于动态方法调用的东西,即即使您将狗标记为猫,然后调用 getFood(),它也会返回 dogFood 而不是 catFood。 *请不要把狗当猫
  • 您尝试这样做的事实表明您的程序中可能存在概念缺陷。因此,您应该花时间修复该概念缺陷,而不是解决问题。无论如何,答案中的示例代码将允许您这样做。
  • 如果这是对使用 Java 的 OOP 的调查,那么我认为您已经得到了足够多的回应来让您忙碌和快乐;-) 如果您正在尝试处理现实生活中的问题最好向我们提供有关这方面的详细信息。可能还有其他方法可以实现您想要实现的目标(实现接口、某种设计模式……)。

标签: java oop


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    设计原则:组合优于继承

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

    可能的情况:

    • 让 Foo、FooBar 和 FooBarBaz 类扩展自抽象类 AbstractFoo
    • 给 AbstractFoo 一个 Calculator myCalc 类型的属性(以及与之配套的 getter 和 setter)
    • 使计算器成为具有方法 doCalc() 的接口,由实现此接口的类实现
    • 创建所有可能的 Calculator 实现(CalculatorX、CalculatorY、..),以实现它们自己的 doCalc() 版本
    • 为 AbstractFoo 提供一个公共 int calc() 方法,该方法调用 myCalc.doCalc() 方法以获得您需要的结果

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

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

    【讨论】:

    • 图书可以在here 其他在线书店中找到。
    【解决方案3】:

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

    例如

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

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

    【讨论】:

    • 如果方法是静态的,则不必实例化
    • @Woot4Moo 是的。但是问题中的示例不包括静态方法。
    【解决方案4】:

    super调用父类的方法

    【讨论】:

      猜你喜欢
      • 2011-04-17
      • 1970-01-01
      • 2012-07-13
      • 2016-04-05
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      • 2023-02-26
      相关资源
      最近更新 更多