关于抽象类与接口
来源:互联网 发布:gta5pc版美女捏脸数据 编辑:程序博客网 时间:2024/05/16 10:07
如果单从具体代码来看,对这两个概念很容易模糊,甚至觉得接口就是多余的,因为单从具体功能来看,除多重继承外(C#,Java中),抽象类似乎完全能取代接口。但是,难道接口的存在是为了实现多重继承?当然不是。我认为,抽象类和接口的区别在于使用动机。使用抽象类是为了代码的复用,而使用接口的动机是为了实现多态性。所以,如果你在为某个地方该使用接口还是抽象类而犹豫不决时,那么可以想想你的动机是什么。
看到有朋友对IPerson这个接口的质疑,我个人的理解是,IPerson这个接口该不该定义,关键看具体应用中是怎么个情况。如果我们的项目中有Women和Man,都继承Person,而且Women和Man绝大多数方法都相同,只有一个方法DoSomethingInWC()不同(例子比较粗俗,各位见谅),那么当然定义一个AbstractPerson抽象类比较合理,因为它可以把其他所有方法都包含进去,子类只定义DoSomethingInWC(),大大减少了重复代码量。
但是,如果我们程序中的Women和Man两个类基本没有共同代码,而且有一个PersonHandle类需要实例化他们,并且不希望知道他们是男是女,而只需把他们当作人看待,并实现多态,那么定义成接口就有必要了。
总而言之,接口与抽象类的区别主要在于使用的动机,而不在于其本身。而一个东西该定义成抽象类还是接口,要根据具体环境的上下文决定。
再者,我认为接口和抽象类的另一个区别在于,抽象类和它的子类之间应该是一般和特殊的关系,而接口仅仅是它的子类应该实现的一组规则。(当然,有时也可能存在一般与特殊的关系,但我们使用接口的目的不在这里)如,交通工具定义成抽象类,汽车、飞机、轮船定义成子类,是可以接受的,因为汽车、飞机、轮船都是一种特殊的交通工具。再譬如Icomparable接口,它只是说,实现这个接口的类必须要可以进行比较,这是一条规则。如果Car这个类实现了Icomparable,只是说,我们的Car中有一个方法可以对两个Car的实例进行比较,可能是比哪辆车更贵,也可能比哪辆车更大,这都无所谓,但我们不能说“汽车是一种特殊的可以比较”,这在文法上都不通。
- 关于接口与抽象类
- 关于抽象类与接口
- 关于接口与抽象类
- 关于C#的抽象类与接口
- 关于接口与抽象类的特点
- 关于接口与抽象类的特点
- 关于抽象类与接口的总结
- 关于抽象方法与接口
- 抽象类与接口
- 接口与抽象类
- 抽象类与接口
- 抽象类与接口
- 抽象类与接口
- 抽象类与接口
- 接口与抽象类
- 抽象类与接口
- 接口与抽象类
- 抽象类与接口
- group by 与聚合函数(T-sql)
- 《程序设计导引及在线实践》开始
- ubuntu下安装Apache+PHP+Mysql
- shell脚本-利用check_snmp查看远程linux操作系统版本
- iwcコピー時計マーティンはいっしょに3モデル
- 关于抽象类与接口
- mysql索引全面观和建立索引的代价
- 如何获取页面中任意元素的offsetLeft和offsetTop
- bootstrap中的dropdown
- 员工综合素质面试题整理和收集
- iwcコピー時計の精致な石英の腕時計を全部で
- 关于EditText获取焦点,隐藏软键盘的问题
- android 实现由下至上弹出并位于屏幕底部的提示框
- 给定某年某月,输出十天后是几年几月几日