今天看文章说到工作中对于接口和抽象类使用是否按照一定标准,仔细想了想,接触的几个项目,都没有按照一定标准使用.
网上搜索了一番,关于使用标准各有各的说法,不过大多数人从类可以继承和接口不可以继承,只可以实现方面考虑,即类的继承认为是"is-a",接口认为是"like-a"这么两种形式.
有的认为接口是一种类似框架的存在,即实现接口的对象可以没有任何关联,完全是不同的类别.
比如说猫,狗可以认为是动物,都有叫这样的行为,叫的内容不同,一个喵喵,一个汪汪,那么可以把叫抽象出来,具体的叫声有子类实现;这样定义为抽象类;再者以飞为例,鸟和飞机都可以飞,但是属于不同类别,则定义为接口.但是个人认为如果把叫的范围扩大一些,不仅仅局限于动物,那么是不是就可以定义为接口了;如果把飞范围缩小些,比如大雁、麻雀,那么是不是可以定义为抽象类了。如此说来,定义是接口还是抽象类,完全由对象的范围来决定,即由项目中的对象来决定.
当然接口需要遵循ISP原则,全称“ISP接口隔离原则”,以下从描述摘自http://baike.baidu.com/item/isp/4807182#viewPageContent
1.使用多个专门的接口比使用单一的总接口要好
2. 一个类对另外一个类的依赖性应当是建立在最小的接口上的
3. 一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。
简单来说就是接口要合乎大小,不要胖,不要瘦.
实现方法主要以下两种:
1、使用委托分离接口.
2、使用多重继承分离接口.
这个明天再详细研究.
总而言之,接口和抽象类的使用规则建立在对象基础上,“is-a”、“like-a”是比较容易理解区别的,需要具体问题具体分析.