您的位置:首页 > 其它

抽象类与接口的深入分析

2013-06-20 19:05 323 查看
今天遇见一个问题,需要在抽象类与接口之间进行选择,以前并没有在这个问题上面做过过多的一些思考。所以在网上参看了很多的帖子,终于有点明了。由于看了太多的帖子不知道应该推荐谁的,而且看的时候他也不一定是原帖。所以就不粘出来了,自己写一篇暂且叫做自己的原创吧!望各位大侠勿喷,如有雷同绝不是巧合,那是赤裸裸的抄袭!废话少说下面开讲:

首先呢,我觉得对于一般的初学者没有必要在这个问题上面纠结太深(如果你不一般,那就另当别论了!),因为在以后的写代码的过程中会慢慢的理解。(网络上某人的观点——的确不晓得这是谁第一提出这个观点。在此我表示赞同)

然后呢,咱们讲讲这个比较表面上的东西,先看看抽象类“在编程语句中用 abstract 修饰的类是抽象类。 在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象。 在java中,含有抽象方法的类称为抽象类,同样不能生成对象。 凡是包含纯虚函数的类都是抽象类。 抽象类是不完整的,并且它只能用作基类。”——源自百度。看看第一、抽象类至少有那么一个特殊的函数;第二、说明除了有特殊函数之外呢还可以有其他的函数;第三、抽象类是不能够实例化的;第四、咱们知道C++中类是允许使用多重继承的并且是没有接口这个说法的,而J***A、C#却是不允许类进行多重继承,但添加了接口,可以实现多个接口。看了抽象类再看看接口:“对一些不能实例化的方法的一个封装”(自己想的,在网上实在没有找到接口的定义,那英文的看着头大)。第一、接口中所有的方法都是不可实例化的函数(在该接口自身中);第二、一个类是可以实现多个接口的。

看了上面的说法你是不是觉得在什么地方用接口什么地方用抽象类是不是没有多少分别呢?当然你可以说用多重继承来区分他们啊!(我以前也是这样)不过很多时候还是无法区分,同时也是没有理解接口和抽象类的真正的意义。

今天看了一个哥们的举例实在是太棒了,在这里我就那这个例子举例吧!我们知道所有的门是可以开关的(哪些特别较真的朋友请注意了。。。),那么我们可以将开和关的属性既可以设计成抽象类,也可以设计成接口,这在表面上是没有什么区别的。那好咱们再看看咱门加一个属性怎么样。如果我们要实现某些门有报警的功能,那么我们有几种解决的方案,例如可以将报警功能到具体的实例中去实现,当然这不是最好的解决方案,不符合我们面向对象抽象的原则(这句话怎么挺起感觉很牛逼的样子啊!);还有一种解决方案就是将报警功能与开关功能集成到一个接口和抽象类中,当然这是不可行的,因为报警功能不是所有的门都具有的;最后还有两种解决方案,1、将开关弄成一个接口、将报警弄成一个接口;2、将开关弄成一个抽象类、将报警弄成一个接口。

看到这里,亲发现没,其实还是就是哪个问题——究竟是将开关功能弄成接口好,还是抽象类好呢?现在有些人忍不住了,你给我尽整那些没用玩意儿干撒!

只是想让你思考一下抽象类和接口而已。

当然,我们应该选择将开关弄成抽象类,将报警弄成接口了。这是为什么呢?通过上面的例子我们知道,报警功能和开关功能之于门是不同的,开关功能是门固有的,而报警功能是我们顺应时代潮流整的。就是说那个抽象的Door和实例化的shiliDoor(英文真心不好)都是门,只是抽象的Door不能实例化而已;而那个接口BaoJing其实根本不是门,他可以是任何的东西,你可以将报警这个功能添加到任何的你想有报警功能的东西上,而你不能将抽象的Door弄到了任何地方?就这么简单!

明白了吧?不明白!!!我管你。。。。



希望各位朋友看过这个过后,能够提供一些意见,这样在相互的交流中实现进步!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: