在java中,是否有允许扩展非抽象类的情况?
当存在类层次结构时,它似乎总是表示错误的代码.你同意吗,为什么/为什么不呢?
有时候有非最终的具体课程是有道理的.但是,我同意Kent的观点 - 我认为默认情况下类应该是final(密封在C#中),并且默认情况下Java方法应该是final的(因为它们在C#中).
正如Kent所说,继承需要仔细的设计和文档 - 很容易认为你可以覆盖单个方法,但不知道可以从基类调用该方法作为其余实现的一部分的情况.
有关此内容的更多讨论,请参阅"如何设计继承类".
我同意Jon和Kent,但是像Scott Myers一样(在Effective C++中),我更进一步.我相信每个班级都应该是abstract
,或者final
.也就是说,只有任何层次结构中的叶类才真正适合直接实例化.所有其他类(即继承中的内部节点)都是"未完成的",因此应该是abstract
.
通常的课程进一步扩展是没有意义的.如果类的一个方面值得扩展和/或修改,那么更简洁的方法是获取一个类并将其分成一个abstract
基类和一个具体的可互换实现.
这个问题同样适用于其他平台,例如C#.NET.有些人(包括我自己)认为类型应该是默认的最终/密封,需要明确地启封以允许继承.
通过继承扩展是需要仔细设计的东西,并不像仅仅保留未密封的类型那么简单.因此,我认为应该是允许继承的明确决定.