为什么编程抽象类而不是接口错误?

Paw*_*wan 2 java oop coding-style

我正在浏览Struts1和Strust2之间的差异,我发现,Struts 1中的一个常见问题是编程抽象类而不是接口.

任何人都可以让我知道,为什么编程抽象类而不是接口是一个问题?

pca*_*cao 6

在Java中,其中一个原因是你没有多重继承,所以当你扩展一个抽象类时,就是它,你无法扩展任何其他类.

解决这个问题的唯一方法是通过一个复杂的依赖树,从长远来看这对你的架构非常糟糕(很难快速找出什么取决于什么).

如果你的C类需要暴露抽象类AC的接口(广义上的接口),那么你可以使C类扩展AC.但是现在你也希望你的C类暴露另一个类AC1的接口......并且没有简单的方法可以做到这一点.你需要求助于合成(我实际上更喜欢扩展),或者你必须让AC1扩展AC ...或其他一些奇怪的伏都教才能使它工作.

在我看来,架构清晰度和可扩展性是人们更喜欢使用Interfaces而不是Abstract Classes来构建解决方案的主要原因.还有一个问题是您的代码可能会变得多么强大.如果从外部程序包/ jar扩展Class,则可能会遇到该特定版本的实现,因为对Abstract Class的更改可能会破坏您的代码.

另一方面...

在接口使用方面,并非所有都是完美的.在某些情况下,尝试成为一个纯粹主义者,并且只使用没有扩展的接口,可能会导致一些不必要的代码重复.真的没有神奇的规则.

为了解决这个问题并且仍然保持灵活性(不会因为您唯一可用的扩展而牺牲自己),您可以通过组合而不是继承来重用代码.实现一个接口,一个具有公共基本代码的类,使用"继承"方法(从接口),代理到该公共类(它成为您的类的属性),并且您拥有两全其美的优势.

最后,我作为开发人员的目标(特别是在Java中),有一天能够表达出Joshua Bloch之前没有表现得更好的观点,直到今天,我没有这样做,所以我留下这个链接到Effective Java,它解释了最后一点,然后我能够:

有效的Java