在重构过程中,我需要通过添加额外的参数来扩展现有的接口。现在有许多旧类实现了无参数版本,还有一些新类实现了带参数版本:
void exec(int parameter);
与
void exec();
最终,我需要接受将两个接口实现到同一集合中的类,并在同一方法中稍后处理。似乎有两种可能的方法:
\1.使用
instanceof
:
int parameter = ...
if (a instanceof NewInterface)
((NewInterface) a).exec(parameter);
else
((OldInterface) a).exec();
这样做的好处是
NewInterface
和
OldInterface
可以是独立的接口。当开发人员编写一个新类时,重写哪些方法可能更明显,重写错误的方法将导致编译时错误。
\2.将单个接口与定义的方法和从一个方法重定向到另一个方法的父抽象类一起使用:
abstract class Common {
abstract void exec();
void exec(int param) { exec(); }
}
这样可以避免
运算符
这在一些讨论中被认为是糟糕的,但现在在每个新类中,我们都必须添加一个看起来奇怪的存根:
// This is not used anymore
void exec() { };
// This is a real functionality
void exec(int param) { ...
看起来也不是最好的设计,尤其是考虑到错误调用这个存根的可能性。
我应该使用第三种方法,还是在instanceof的使用合理的情况下?