【面向对象的本质】

什么是面向对象的本质

未找到原文出处(时间戳是2010年的),网上文章都在前几年发的
并且加上了自己的理解和例子,故投原创

万物皆对象?No
  抽象?No
  复用?No

那到底是什么呢?

万物皆对象。问了几位网友,这是答复之一。看到了某个事物就来一个class?显然没有那么简单。至少也要抽象一下呀。

抽象。比如一些文章里说,可以根据猫猫、狗狗抽象出来一个Animal出来,然后定义Cat,继承Animal,在定义Dog,也是继承Animal。抽象就是本质了吗?那么为什么要抽象,而不直接定义Cat、Dog呢?这么“折腾”一下的目的是什么呢?或者说有什么好处?

复用。Cat可以复用Animal里的属性、方法等,Dog也可以复用Animal里的属性方法。猫猫和狗狗都有腿,询问腿的数量,可以用同一个方法。这样看来复用好像就是本质了。

哎,说道复用我就比较郁闷。我是从面向过程学过来的,经过漫长艰苦的学习,现在还没有完全转到面向对象。好像跑题了。

面向过程里就解决了复用的问题,定义一个过程(过程、函数)就可以达到复用的目的。别人有的,你也有,那不算什么优势。别人没有的你有,那就是优势了。既然面向过程已经可以服用了,那么在面向对象里面也谈复用,那还有什么优势呢?

面向过程可以达到复用的目的,但是有一个致命的缺点:混乱。定义出来的函数没有层次,没有管理。假设一个项目里有一万个函数,那么这些个函数就会杂乱无章的出现。要管理的话也只能按照页面、窗体等来划分。总之呢,想要管理好面向过程里的众多函数是一件头痛的事情。

我觉得面向对象是有面向过程“进化”过来的,但是有人说面向对象是直接“蹦”出来的,不管他是怎么出来的了,总之他是很好的解决了“管理复用”的问题。

封装(Class):把相关的属性、方法、事件放在一起,化零为整,统一管理。该隐藏的隐藏,该暴露的暴露。这是管理的第一步。

问题来了,动物都会叫,但是猫是喵喵,狗是汪汪,鸭子是嘎嘎怎么办

继承:都封装起来了,那么就失去了灵活性。如何保证灵活性呢?继承(还有函数重载等)。也就是多态了。父类的叫声方法,子类可以自己继承,也可以实现。

问题来了,不是所有的鸭子都会飞,要怎么解决呐
继承显然不是个好的选择

接口:抽象基类是一个很好用的东东,但是他只能管同一个家族里的,另一个家族的就不行了。接口就可以跨越不同的家族。当然接口也有一个致命的弱点,本身不能有任何的实现部分,他只能定义。鸭子现在将飞行的动作委托别人处理,而不是使用定义在duck类或子类内的飞行方法

组合(合成):父类、子类、抽象基类,这些都是一个家族里的关系,那么两个家族有如何呢?组合。Has A,一个类里包含另一个类,通过这种方式来实现复用。这又是复用的一种管理方法。

面向对象的各种特点都是为了“管理复用”,所以我觉得面向对象的本质是“管理复用”。同时行为也是一种对象,更准确的说一组行为是一簇算法。面向对象应考虑 有什么,而不是 是什么,由此来看应多用组合,少用继承。设计思路是找到不变的和可变的,把会变化的部分取出并封装,以便以后可以轻易地改动或扩充,而不影响需要变化的其他部分。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值