例如,房地产开发商正在建造带有许多公寓的公寓。除卧室外,公寓中的所有房间都具有相同的设计。卧室的设计留给了那些拥有公寓的人。床房间可以针对不同的公寓采用不同的设计。
我可以通过abstract
类似以下的类来实现:
public abstract class Flat
{
//some properties
public void livingRoom(){
//some code
}
public void kitchen(){
//some code
}
public abstract void bedRoom();
}
}
一个implementation
类如下:
public class Flat101 extends Flat
{
public void bedRoom() {
System.out.println("This flat has a customized bedroom");
}
}
另外,我可以使用类interface
而不是abstract
类来实现相同的目的,如下所示:
class Flat
{
public void livingRoom(){
System.out.println("This flat has a living room");
}
public void kitchen(){
System.out.println("This flat has a kitchen");
}
}
interface BedRoomInterface
{
public abstract void bedRoom();
}
public class Flat101 extends Flat implements BedRoomInterface
{
public void bedRoom() {
System.out.println("This flat has a customized bedroom");
}
}
现在的问题是:为此,为什么要选择使用interface
(或)为什么要选择使用abstract
类?
这取决于您的意图或用例。但是总的来说,您应该更喜欢接口而不是抽象类(Bloch的Effective Java中的第18项)。抽象类更易碎,因为有人可以修改抽象类,从而改变从其扩展的其他类的行为(这是一般性声明)。
使用接口更加灵活,因为如果您具有BedroomInterface和LivingRoomInterface,则可以让FlatInterface实现这两个接口,然后Flat101实现类将实现FlatInterface(而不是从Flat扩展然后实现一个接口)。这似乎更清楚了,以后您可以拥有ExecutiveFlatInterface,它不仅具有卧室和客厅,而且还具有猜测空间,然后Flat102可以从中实现。
选项2是从Flat扩展Flat101,然后Flat实现BedroomInterface和LivingRoomInterface。这实际上取决于您要执行的操作以及可能需要的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句