为什么要使用抽象类而不是接口?

suganya:

例如,房地产开发商正在建造带有许多公寓的公寓。除卧室外,公寓中的所有房间都具有相同的设计。卧室的设计留给了那些拥有公寓的人。床房间可以针对不同的公寓采用不同的设计。

我可以通过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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章