8

次のように変数を設定するためのヘルパー メソッドを使用して、いくつかのカスタム例外を作成しようとしています。

public class KeyException extends RuntimeException {
    protected String Id;

    protected KeyException(String message) {
        super(message);
    }

    protected KeyException(String message, Throwable cause) {
        super(message, cause);
    }

    public String getId() {
        return keyId;
    }

    public KeyException withId(final String Id) {
        this.Id = Id;
        return this;
    }
}

ただし、派生クラスでは、基本クラスのみを返すため、「withId」メソッドを使用できません。すべての派生クラスでメソッドをオーバーライドすることなく、「this」ポインターを返す方法はありますか?

4

6 に答える 6

9

すべての派生クラスでメソッドをオーバーライドすることなく、「this」ポインターを返す方法はありますか?

はい、以下のオプション 1 を見てください。

ここで実行できる方法はいくつかあります。

  1. 結果を派生クラスにキャストする

  2. サブクラスでオーバーライドする

  3. 戻り値の型を void に変更します。オブジェクトのメソッドを呼び出しているため、既にそのオブジェクトへのポインターがあります。

于 2013-08-13T08:33:04.727 に答える
9

次のようなことができます。

public <T extends KeyException> T withId(final String Id) {
    this.Id = Id;
    return (T)this;
}

次に、派生クラスで、その型を型パラメーターとして渡すだけです。

ただし、設計上の見落としがある場合があります。ビルダー パターンを除けば、セッターがオブジェクト自体への参照を返すことはめったにありません。より多くのコンテキストを提供していただければ、より多くのお手伝いができます。

于 2013-08-13T08:37:44.520 に答える
1

ジェネリックを使用してサブクラスを返す問題を解決する方法が 1 つあります。

// base class

public class Base<T extends Base> {

  private T myself;

  public Base(T myself, Class<T> cls) {
    this.myself = myself;
  }

  public T withSomething() {
    return myself;
  }
}

// subclass

public class SomeSubCls extends Base<SomeSubCls> {

  public SomeSubCls() {
    super(this, SomeSubCls.class);
  }
}

このパターンnew SomeSubCls().withSomething()を使用すると、オブジェクトは親ではなくサブクラスのインスタンスとして返されます。

たとえば、fest アサーションで使用されます。これを確認してください

于 2013-08-13T08:41:18.520 に答える