getMessage()の実際の実装を新しい具象クラスに入れ、とでそのクラスのインスタンスにデリゲートする必要がありMyException
ますMyRuntimeException
。
class MyExceptionMessage {
public String getMessage() { ... }
}
class MyException extends Exception {
private MyExceptionMessage messager;
public String getMessage() { return messager.getMessage; }
}
class MyRuntimeException extends RuntimeException {
private MyExceptionMessage messager;
public String getMessage() { return messager.getMessage; }
}
MyExceptionMessageのインスタンスは、各例外クラスのコンストラクター、またはその他の方法で作成できます。お気づきのように、単一の継承で立ち往生しているため、2つのクラス間で実装を再利用する場合は、委任を回避する方法はありません。
クリスが指摘したように、彼の答えでは、静的ヘルパーメソッドも理にかなっています。少なくとも、メッセージ戦略が複雑になり、作成できるインスタンスがいくつかあることを保証するまでは。
編集:
例外クラスの名前にアクセスするには、コンストラクターに何かをMyExceptionMessage
渡します。例外オブジェクト、そのクラス、またはクラスの名前を渡すことができます。例外が実装するインターフェースを定義することもできます。これには、メッセージ送信者に知っておく必要のあることをすべて伝えるメソッドが含まれています。
interface Messagable {
public String getMessageFragment();
}
class MyExceptionMessage {
public String getMessage(Messageable) {
return "something" + messagable.getMessageFragment() + "something else";
}
}
class MyException extends Exception implements Messagable {
private MyExceptionMessage messager;
public String getMessage() {
return messager.getMessage(this);
}
}
// class MyRuntimeException would have a similar getMessage() implementation