2012-10-08 15 views
1

是否可以在運行時修改抽象方法的返回值?在運行時修改抽象方法的返回值

例如:

public abstract class Task { 
    public abstract boolean validate(); 

    public void setValidate(boolean b) { 
     /* modify the return value of 'validate' method */ 
    } 
} 

回答

2

爲什麼不直接在Task一個boolean場,有validate回報字段的值,並有setValidate改變價值?

public abstract class Task { 
    private boolean isValid; 
    public boolean validate() { return isValid; } 
    public void setValidate(boolean b) { isValid = b; } 
} 
+0

我想驗證是抽象的,因爲我將要使用這個頗有幾分在我即將進行的項目。 這樣我不會忘記設置驗證。 – Strikegently

+0

你唯一真正的選擇是這個,或者只是不提供'setValidate'方法,並要求子類自己實現'validate'。 –

+0

子類實現驗證。任務的每個子類都將擁有自己的驗證方法,迎合其特定目的。 setValidate方法的要點是根據其他要求修改執行此任務的要求。 – Strikegently

0

唉,如果只有你可以(很容易,無論如何)。但是,如果您可以修改抽象類和子類,則有一種解決方法。使子類實現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; 
    } 
}