随笔 - 312, 文章 - 14, 评论 - 1393, 引用 - 0
数据加载中……

接口、类、抽象类、对象的另类解释

本文为原创,如需转载,请注明作者和出处,谢谢!

    大家也许都知道做工艺器或是工厂里做生产某些产品的模具模具。如做一个金属的五角星,只要将钢水罐到五角星的模具模具里就可以很容易地制做五角星。

    我们也可以将类比喻成做五角星的模具。  而生产出的一个个五角星就是一个个对象。 为了建立不同的对象(有的是金属的、有的塑料的,等等),可通过向模具里灌入不同的液态材料就可以制做。这也相当于向类的构造方法中传入不同的参数(相当于不同的液态材料)。

    还有就是接口,如果说类是对象的抽象,那么接口就是类的抽象。
我们也可以将接口看成是制做这个五角星模具的规格列表(相当于接口中的抽象方法)。也就是说,只有这个模具(类)符合(实现)相应的规格(接口),才会成为制做五角星的模具模具。

哈哈,当然,这个使用模具生成五角星及其他产品的工厂可以看成是对象工厂。

class ObjectFactory
{
    
public static 五解星 create五角星() {}
   
    
public static 圆 create圆() {}

      
public static 椭圆 create椭圆() {}
    
}


    也就是说,类和接口都不是实际的产品,都不能拿来用,类相当于模具(没人会拿模具模具在商店里卖吧,估计只有对象工厂会买),而接口只相当于制做模具的规 格列表,如尺寸、角度等。而这些规格列表的内容需要在具体类中实现才可能成为具体的模具,如长度和宽度,如果在类中实现为长度等于宽度,那么这个类就成为 一个成方形的模具,如果长度不等于宽度,就是一个长方形的模具。然后再实例化这个模具(类),就生成出一个个正方形或长方形对象。

    在面向对象理论中还有一个抽象类,这个抽象类其实就相当于一个半成品的模具。如只实现在长度和宽度(相当于在抽象类中已实现的方法),并没有实现深度(这 个深度相当于抽象类中的抽象方法,这个抽象方法需要在抽象类的子类中实现)。所以这个模具就是半成品了。因此,是无法直接拿半成品的模具(抽象类)去生产 (实例化)产品(对象)的。





Android开发完全讲义(第2版)(本书版权已输出到台湾)

http://product.dangdang.com/product.aspx?product_id=22741502



Android高薪之路:Android程序员面试宝典 http://book.360buy.com/10970314.html


新浪微博:http://t.sina.com.cn/androidguy   昵称:李宁_Lining

posted on 2008-04-27 09:50 银河使者 阅读(2558) 评论(9)  编辑  收藏 所属分类: java 原创

评论

# re: 接口、类、抽象类、对象的另类解释  回复  更多评论   

不严谨。

一个类可以有多个接口,如果接口是规格,那么一个类岂不是有多个规格?规格比喻成类更合适。
类是个定义,是生产之前的东西,只有实例化之后才是实实在在的东西。真的可以可以比喻成模具的是工厂类的生产方式。
2008-04-27 10:52 | stanleyxu

# re: 接口、类、抽象类、对象的另类解释  回复  更多评论   

一个类当然可以有多个规格。就象一个模具,如五角星,当然可以有多个规格(如角度不同,五角星也有很多变了型的,哈哈),

接口:规格
类:模具
对象:用模具制作的产品

一个类(模具)可以实现多个接口(规格)。一个模具可以建立多个对象(产品)。

2008-04-27 11:04 | 银河使者

# re: 接口、类、抽象类、对象的另类解释  回复  更多评论   

接口不是oop的一部分,是后来才有的。它和抽象类有点类似,所以经常放在一起比较。我对此文的不少解释不敢苟同。
1. 对象是原子类,你想说的对象,我认作为实例。如果你去看java的文档,里面写的很清楚:Class Object is the root of the class hierarchy.
2. 接口如我所说,不是oop的一部分,他是不需要继承机制的。也就是说,任何2个不相关的类,可以拥有同样的一个接口。这个你可以解释成:任何2个不同的模具都拥有一样的规格?

如果按照我的说法:
接口是特殊设计要求,抽象类是设计方案模板,类是具体设计方案,实例是成品。
那么一个产品的设计方案可以是由具体设计方案而来。(一个类可以是从抽象类继承)
一个设计方案可能需要符合多个特殊设计要求。(一个类可以拥有0..n个接口)
只有通过具体设计方案才可以生产成品,而不能根据方案模板或者一个特殊设计要求进行制造。(一个实例是通过类创建,而不是直接从一个抽象类或者接口创建)
2008-04-27 11:51 | stanleyxu

# re: 接口、类、抽象类、对象的另类解释  回复  更多评论   

更正上一个评论:
一个产品的设计方案可能是根据某个设计方案模板修改而来。(一个类可以是从抽象类继承)
一个(具体)设计方案可能需要符合多个特殊设计要求。(一个(抽象)类可以拥有0..n个接口)
只有通过具体设计方案才可以生产成品,而不能根据一个方案模板或者一个特殊设计要求直接进行制造。(一个实例是通过类创建,而不是直接从一个抽象类或者接口创建)
2008-04-27 12:00 | stanleyxu

# re: 接口、类、抽象类、对象的另类解释  回复  更多评论   

总之,先有的类,然后再有的接口,接口主要是为了制定规范而存在的。如在团队开发过程中,设计师可以会设计一系列的接口,然后所有的开发人员在开发component时,都会遵循这些接口。这样就可以尽量避免设计和实现冲突。
就象servlet、jsp、ejb的规范都是由接口(也有抽象类)组成的。

至于抽象类,我认为是sun的设计师看到接口和类都有缺点。接口虽然可以强迫类必须实现接口的方法,但是如果多个类同时实现一个接口,而这个接口中的一些方法在这些类中的实现是完全一样的。那么就会出现代码冗余(虽然可以使用组合的方式解决,但仍会出现一定的代码冗余)。因此,java就会为我们增加了抽象类,既可以强迫抽象类的子类实现某些方法,又可以达到代码重用。

因此,也可以这么说。所有的方法都是抽象方法的抽象类就是接口,所有的方法都是普通方法的抽象类就相当于普通类(虽然不能创建抽象类的实例)

就象一个划杆,左边代表抽象,右边代表具体。如果划到最左边,就是接口,划到最右边,就相当于普通类(除了不能创建实例,其他的和普通类完全一样)。

总之,有了抽象类,就可以同时拥有接口和普通类的优点,而屏蔽了接口和普通类的缺点。

注:接口的主要缺点是不能代码重用。
类的主要缺点是继承一个普通类后,在创建子类实例时,父类也会创建一个实例,也就是说更耗资源,同时,也不能强迫子类必须继承父类的某些方法。
2008-04-27 13:56 | 银河使者

# re: 接口、类、抽象类、对象的另类解释  回复  更多评论   

至于对抽象类和接口的理解,看来我们2个中肯定有一个人是错了。

1:类、抽象类都是oop的概念,而接口是后于oop的产物。不是说抽象类比普通类+接口更有优势。恰恰相反的是,抽象类虽然提供了代码重用,但是仅限于同一个类的继承构架(class hierarchy),/为了突破继承构架的束缚/才引入了接口的概念。

2:接口虽然像是万能胶,可以定义到任何类中,但代价是:代码必须独立实现,哪怕它们的实现代码完全一致。(当然如果代码完全一致,还是有办法可以重用的) 至于什么时候用接口和什么时候用继承类也是根据情况而定。(它们各有优缺点,网上查吧,一堆呢) 但是要记住!接口在一定成都上破坏了oop,把无关东西关联起来了。

3:至于说类的层层继承构架耗资源,如果你为了省资源要打破oop,那是你的事情了。没人说你必须或者不可以这样做。

讨论了半天已经偏了,但你的解释的确够另类的。你的文章因为登在了blogjava的阅读提醒中,无意看见而已,并非无事找茬。如果你认为我说的哪点是不对的,欢迎指教。
2008-04-27 14:59 | stanleyxu

# re: 接口、类、抽象类、对象的另类解释  回复  更多评论   

哈哈,任何东西都有缺点,抽象类也类例外。不能多继承是目前大多数面象对象语言都存在的问题,有利必有弊。但总体上是平衡的。最好是根据具体的需要使用接口、抽象类或普通类,以及它们的任意组合。没有绝对的好坏之分。只要能满足要求,就是正确的选择。
本文的目的并不是深究这些东东哪个更好,哪个不好。只是在itpub上有人不太明白接口、类、抽象类之间的关系,这是我的一个回答,希望对初学者有一些帮助。至于如何应用它们才更好,并不是本文要讨论的范围。
不过我衷心希望各位高手可以将自己的设计思想和设计理念共享出来,以便和大家分享。谢谢!

2008-04-27 15:12 | 银河使者

# re: 接口、类、抽象类、对象的另类解释  回复  更多评论   

to stanleyxu

你说接口破坏了oop的规则。在我看来,先不管接口是否打破了oop。单就oop本身来说,它的存在并不是让我们非得使用它,换句话说,我们不能为了使用oop而使用oop,就象有很多java framework,我们也不能为了使用它们而使用它们。

虽然oop从总休上说可以使大规模团队开发成为可能,但oop从某种程度上也确实增加了程序的复杂度,只是现在程序规模的增加程度远远超过了oop所给我们带来的复杂程度,因此,我们感觉oop给我们带来了方便。

但如果各位读过按着oop思想的编写的源代码。就会感觉到,读起来,要远比过程语言更难阅读。当然,我承认有更好的读oop源代码的方法,但oop也确实正在使这个世界变得更复杂。哈哈,这个世界本来就很复杂!!多留恋当初的汇编和C语言时代啊!没有这么多概念,一切都是tech-to-tech。不过社会在发展,当然,编程思想也得与时俱进。但愿将来出个比oop更好的编程方式或技术。最好由计算机自己去编程,那样程序员就可以一边喝咖啡,一边看着自己喜欢的video。尽情地享受生活。 是不是有些象科幻啊! 我就用火箭之父齐奥尔科夫斯基话过的一句话结尾吧:昨天的梦想就是今天的希望,更是明天的现实。 但愿每个人天天做好梦,而且梦想成真!
2008-04-27 15:34 | 银河使者

# re: 接口、类、抽象类、对象的另类解释  回复  更多评论   

我只是告诉你,你文章的比喻错了。对类和接口的概念也有点问题。
但你下面说的这些不知道是想干嘛。
2008-04-29 12:42 | stanleyxu

只有注册用户登录后才能发表评论。


网站导航: