繁体   English   中英

当我们重写一个方法时,我们应该使用方法签名中的所有参数吗?

[英]When we override a method we should use all the parameters that are in the method signature?

我发现一些替代方法未使用方法签名中的所有参数。

例如:

@Override
protected void setSomething(Object a, Object b, Object c) {
    this.a = a
    this.b = b;
    // the parameter c is not used (ignored)
}

通常,父类不必关心子代将如何实现抽象方法。

但是在MHO中,将使用方法的参数,当子类实现不需要参数时,这种情况非常少见,当这种情况发生时,接口的设计或抽象类可能存在问题。

一个功能的基础是:输入->输入过程->输出。

有时您需要计算这些输入,但是如果您不打算在函数的过程中使用其中的某些输入,则不应将这些输入作为函数的输入。

您可以跳过这些输入的计算,从而调用使用所有输入的精确函数,因此该精确函数。

这种情况唯一可以接受的情况是,当我们不想父类的行为时,可以这样写:

@Override
protected void setSomething(Object a, Object b, Object c) {
      //Nothing to do
}

要么

@Override
 protected void setSomething(Object a, Object b, Object c) {
  throw new UnsupportedOperationException(...);
}

声纳说:

未使用的参数会产生误导。 无论传递给此类参数的值是什么,其行为都将相同。

我的问题是:当我们重写方法时,应该使用方法签名中的所有参数吗?

当我说“使用所有参数”时,我试图说方法签名中的所有参数实际上都在方法的主体(实现)中使用。

当我们覆盖一个方法时,我们应该使用该方法签名中的所有参数吗?

覆盖方法时,被覆盖的方法必须定义与超级方法相同的参数。

您没有义务在实现中使用所有参数-这取决于您希望通过此实现实现什么,有时可能不需要所有参数。

但是,在方法实现中使用未使用的方法参数是不良设计的标志。 定义方法( abstract或实现)时,应尝试回答以下问题: “为什么需要此参数?” “是否将始终使用此参数?” 如果有可能在实现中不使用某些参数的情况,则可以定义一些重载方法。

以这个例子为例。 让我们有这个方法

void someMethod(String first, String optionalParameter) { ... }

第二个参数是可选的(即可能是必需的,也可能不是)-当不需要该参数时,可以传递null或其他任何参数。 在这种情况下,我将重载两种方法

void someMethod(String first) { ... }

void someMethod(String first, String second) { ... }

并且我还将确保在相应的实现中使用所有参数。

需要使用所有参数吗? 不会。您经常会看到以下示例:

@Override
public void doFoo(String thingy) {
  // no-op
}

要么

@Override
public void doFoo(String thingy) {
  throw new UnsupportedOperationException(...);
}

但是两者都表明某个地方存在可疑的设计。 例如, java.util.List甚至java.util.Iterable都通过提供变异方法来排除不可变集合的可能性。 不可变的实现必须抛出UnsupportedOperationException

如果覆盖方法,则必须使用所有参数。

但是您也可以重载方法-使用相同名称但参数不同的方法编写方法。 因此,如果不使用所有参数,则说明您正在重载,而不是覆盖。

class Accessor {

    public void doSomething(String attr) {}

}

class Child extends Accessor {

    // This is overriding
    @Override
    public void doSomething(String attr) {
       // ...
    }

    // This is overloading
    public void doSomething() {
       // ...
    }
}

正如您所说:“我们应该”-但我们不必这样做。 有时,实现方法甚至会抛出RuntimeException ,例如Java Collections Framework的UnsupportedOperationException

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM