1

実行時に抽象メソッドの戻り値を変更することは可能ですか?

例えば:

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

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

2 に答える 2

2

booleanにフィールドがあり、そのフィールドの値Taskvalidate返し、その値を変更していないのはなぜsetValidateですか?

public abstract class Task {
  private boolean isValid;
  public boolean validate() { return isValid; }
  public void setValidate(boolean b) { isValid = b; }
}
于 2012-10-08T16:51:20.127 に答える
0

悲しいかな、もしあなたができれば(とにかく簡単に)。ただし、抽象クラスとサブクラスを変更できる場合は、回避策があります。protected代わりにサブクラスにメソッドを実装させてから、メソッドが検証する前にvalidate()の値をチェックするようにします。サブクラスが変数をチェックしないように変更できないように、例のようにfinalメソッド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;
    }
}
于 2012-10-08T17:47:20.027 に答える