簡體   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