我一般反对扩展,因为它在类之间创建了非常强的连接,很容易意外中断。
但是,我最终认为我已经找到了一个合理的案例——我想在现有系统中选择使用文件类型的压缩版本。压缩版本几乎与未压缩版本一样快,并且具有完全相同的可用方法(即读取和写入)——唯一的区别在于磁盘上的表示。因此,我让压缩版本扩展了未压缩版本,以便可以使用任何一种文件,只需选择性地实例化另一种类型即可。
public class CompressedSpecialFile extends SpecialFile(){ ... }
if (useCompression){
SpecialFile = new CompressedSpecialFile();
} else {
SpecialFile = new SpecialFile();
}
但是,在程序的稍后阶段,我们使用反射:
Object[] values = new Object[]{SpecialFile sf, Integer param1, String param2, ...}
Class myclass = Class.forName(algorithmName);
Class[] classes = // created by calling .getClass on each object in values
constructor = myclass.getConstructor(classes);
Algorithm = (Algorithm) constructor.newInstance(values)
一切正常,但现在 myclass.getConstructor 类抛出 NoSuchMethodException,因为 SpecialFile 的运行时类型是 CompressedSpecialFile。
但是,我认为扩展应该是这样工作的——因为 CompressedSpecialFile 扩展了 SpecialFile,所以任何接受 SpecialFile 的参数都应该接受 CompressedSpecialFile。这是Java反射的错误,还是我理解的失败?