您必须将 getMessage() 的实际实现放入一个新的具体类中,并委托给该类的实例 inMyException
和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 的实例,或者以其他方式。正如您所指出的,您被单继承所困,因此如果您想在两个类之间重用实现,就无法避免委托。
正如 Chris 所指出的,在他的回答中,静态辅助方法也很有意义。至少在您的消息策略足够复杂以保证您可以编写一些实例之前。
编辑:
要访问异常类的名称,请将某些内容传递给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