【问题标题】:Overriding a method with more parameters in java?在java中覆盖具有更多参数的方法?
【发布时间】:2016-01-21 04:09:24
【问题描述】:

我有一个基类,其方法名为execute

class A {
    public execute(int a){}
}

我也有一个类B,它扩展了A,但是execute方法需要更多的参数:

目前,我的解决方案是使用可选参数:

class B extends A {
    public execute(int a, Object... parameters){
        long b = (long)parameters[0];
        boolean c = (boolean)parameters[1];
        ....
    }
}

这仍然很难看,因为我必须对参数进行强制转换。这种情况还有其他选择吗?

【问题讨论】:

  • 您是否希望execute() 有固定数量的参数?
  • 参见 Vitalii Fedorenko 的 answer,其中列出了所有可能的选项。
  • @Atri :我不需要固定数量的参数,我想通过基类调用。例如:A a = MyFactory.getInstance(...) , a.execute(...)

标签: java oop overriding overloading


【解决方案1】:

你可以在 B 中添加一个execute(int a, int b),但它不会覆盖execute(int a) 方法,它会重载它。这两种方法都可以在 B 的实例上调用。

【讨论】:

  • 是的,如果我使用 B 的实例很好,但在我的情况下,我使用基类 (A) 的实例。
【解决方案2】:

这将打破 OO 范式。实线中的 L 代表 Liskov 替换原理。

适用于您示例的原则是 B 应该像 A 一样行事。

更好的解决方案是通过构造函数注入这些参数并在没有任何参数的情况下执行。

class A {
    int a;
    public A(int a){
        this.a = a;
    }
    public execute(){ // do something with a}
}

class B {
   int a;
   long b;
   boolean c;

    public B (int a, long b, boolean c) {
        this.a = a;
        this.b = b; 
        this.c = c;
    }

    public execute(){ // do something with a, b and c}

}

【讨论】:

  • 但是当B需要比A更多的参数时如何注入参数?
  • A 和 B 将拥有自己的构造函数,并拥有他们需要的参数。
  • 是的,但就我而言,我使用工厂来创建基类 A 的实例。
  • 你能发布更多代码吗,我不确定我是否在关注?
猜你喜欢
  • 1970-01-01
  • 2019-01-02
  • 2014-08-11
  • 1970-01-01
  • 2013-08-22
  • 2020-02-28
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
相关资源
最近更新 更多