Explaination for Class, Abstract Class and Interface

        面向对象的编程相对于面向过程的编程,最明显的区别是引入了类的概念。类可以被继承,也可以被组合到其他类中去。于此同时,一些与类概念是类似的概念,接口和抽象类也被带到了其中。

        对于 C#和Java程序员来说,每天都和类打交道,但很少有时间认真思考一下为什么要引入类这个概念。在长期的工程实践中,代码复用已经成为了最有吸引力的努力方向之一,很多人都认为,继承,是面向对象所提供的代码复用的方式。然而,如果你认真读了设计模式的书,并且有所理解的话,那些最好的书,其实就是围绕了2个字--抽象。

        如果你认同上面这个观点,那么,对类的解释是--对事物的抽象。举个例子来说,你在车站买杂志,售货员是一个中年妇女,传统的编程方式,你必须认识那个中年妇女--知道她就是售货员,知道要调个函数--买杂志,输入参数--给钱,然后得到杂志。但是,第二天,中年妇女换成了青年小伙,问题来了,你不知道他是谁了。你必须重新编写对于小伙子的购买函数。第三天,你崩溃了,原来又来了一个售货员,他们3个还轮班。OO用抽象来描述了这个问题,他们3个被抽象成了售货员,他们都有一个相同的函数--卖杂志。对于你来说,你只知道来到售货亭,把钱人进去,杂志就出来了,不管卖杂志的换了谁,都同你无关。

        把上面的例子进一步演化,售货亭里有2个人,一个卖报纸,一个卖杂志,调用方有时要看杂志,有时要报纸。问题来了, 你要写2个函数来买不同的东西,并且以后还要根据需求的扩展写更多的函数。OO对这个问题的解释是,这个时候,你只要找到导购,导购会推荐给你那个你想要的售货员,可能是卖报纸,也可能是卖杂志的反正都是抽象概念,你不用看,直接付钱拿货就行。这个导购,就是类工厂。

       如果类是事物的抽象,那么,类还可以进一步被抽象,就像售货员可以被抽象成服务人员,他们具有服务人员的一般特性,如此继续抽象,直到一切具体的依赖都不在存在,那么就产生了一种特别的类--抽象类。类抽象到一定层次,摆脱了对实现的依赖,就是抽象类

       对于接口,相对于抽象类来说,最大的2点区别,就是不能有成员变量,可以多重实现(继承)。还是买杂志的例子,你现在已经很聪明了,你知道不从具体的人这里买杂志,而是从售货员这个相对抽象的对象这里操作。但是你还是崩溃了,因为今天你看到的是一个自动售货机。无论如和,自动售货机是不可以被抽象成售货员的。你的设计已经奔溃,OO在这种情况下提供的解决方案是,用接口来提供卖报这个方法。接口,就是对功能和行为的抽象。它是编程,摆脱了对事物本质上的依赖,不管男人女人,都是售货员的派生。但你并不关心售货员除了卖报以外的其他事情。因此,对售货员的抽象是不合适的,更好的实践是得到对卖报行为抽象,永远保证你能调用这个功能。

 

       其实以上这些东西,在工作中用的很少。需求描述的永远是那么Special,所有的功能永远直接依赖界面。在MS的窗体编程模型下,你永远是实现功能,编写事件。这些都是面向过程的编程。于是我们不难理解,为什么VB是世界上使用人数最多的语言,为什么编程变成了体力劳动。面向对象,与程序员无关,在我看来,要做到面向对象的设计,至少是在需求分析的时候就要有设计参与,也就是说要业务技术双精通,我们都管这样的人叫咨询。但现在你看到的叫咨询的,不都是只会忽悠人呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值