是否可以在運行時修改抽象方法的返回值?在運行時修改抽象方法的返回值
例如:
public abstract class Task {
public abstract boolean validate();
public void setValidate(boolean b) {
/* modify the return value of 'validate' method */
}
}
是否可以在運行時修改抽象方法的返回值?在運行時修改抽象方法的返回值
例如:
public abstract class Task {
public abstract boolean validate();
public void setValidate(boolean b) {
/* modify the return value of 'validate' method */
}
}
爲什麼不直接在Task
一個boolean
場,有validate
回報字段的值,並有setValidate
改變價值?
public abstract class Task {
private boolean isValid;
public boolean validate() { return isValid; }
public void setValidate(boolean b) { isValid = b; }
}
唉,如果只有你可以(很容易,無論如何)。但是,如果您可以修改抽象類和子類,則有一種解決方法。使子類實現protected
方法,然後使其成爲validate()
方法在驗證之前檢查validate
的值。您應該也可以使validate()
成爲最終方法,如我在示例中所述,以便子類不能將其更改爲而不是檢查變量。當然,這取決於你。
這裏有解決方法的代碼:
public abstract class Task {
private boolean validate = true;
public final boolean validate() {
// Assumes that no validation means validation always passes
return validate ? validateImpl() : true;
}
protected abstract boolean validateImpl();
public void setValidate(boolean validate) {
this.validate = validate;
}
}
我想驗證是抽象的,因爲我將要使用這個頗有幾分在我即將進行的項目。 這樣我不會忘記設置驗證。 – Strikegently
你唯一真正的選擇是這個,或者只是不提供'setValidate'方法,並要求子類自己實現'validate'。 –
子類實現驗證。任務的每個子類都將擁有自己的驗證方法,迎合其特定目的。 setValidate方法的要點是根據其他要求修改執行此任務的要求。 – Strikegently