cor*_*iKa 39
当你想说"我不在乎你怎么做,但这就是你需要完成的事情"时,接口就是用来做的.
当你想说"我知道你应该做什么,我知道你应该如何在一些/许多案例中做到这一点"时,抽象类就是适用的.
抽象类有一些严重的缺点.例如:
class House {
}
class Boat {
}
class HouseBoat extends /* Uh oh!! */ {
// don't get me started on Farmer's Insurance "Autoboathome" which is also a helicopter
}
Run Code Online (Sandbox Code Playgroud)
您可以通过界面获得:
interface Liveable {
}
interface Floatable {
}
class HouseBoat implements Liveable, Floatable {
}
Run Code Online (Sandbox Code Playgroud)
现在,抽象类也非常有用.例如,考虑AbstractCollection类.它为所有集合定义了非常常见的方法的默认行为,例如isEmpty()
和contains(Object)
.如果您愿意,可以覆盖这些行为,但是...是确定集合是否为空的行为确实可能会更改?通常它会是size == 0
.
而且由于它不会经常改变,开发人员是否真的值得每一个......单个...时间......为那个"已解决"的类别中的每个方法实现该方法?更不用说当你需要对它进行更改时,如果你不得不在任何地方重新实现它,你将会有代码重复和错过的错误.