面向对象的本质是什么?

  什么是面向对象的本质呢?

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

  那到底是什么呢?

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

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

复用。Cat可以复用Animal里的属性、方法等,Dog也可以复用Animal里的属性方法。这样看来复用好像就是本质了。

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

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

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

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

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

====================

继承:都封装起来了,那么就失去了灵活性。如何保证灵活性呢?继承(还有函数重载等)。也就是多态了。相同的放在父类,不同的放在子类。这是我的理解,当然你可以说这种理解是错误的。Class就好比一个大的家族,父类是根基,子类各有各的特点。正所谓:龙生九子各有不同。

子类可以复用父类里的属性、方法、事件,这就是一种复用的管理方法。

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

接口:抽象基类是一个很好用的东东,比如DbCommand,用过的兄弟们都会体会到他的方便吧。但是他只能管同一个家族里的,另一个家族的就不行了。如果哪个数据库(比如PostgreSQL)没有继承DbCommand怎么办呢?接口就可以跨越不同的家族。当然接口也有一个致命的弱点,本身不能有任何的实现部分,他只能定义。

  面向对象的各种特点都是为了“管理复用”,所以我觉得面向对象的本质就是“管理复用”。至于对象只是一种“表象”。

  在多说几句,我是不喜欢被所谓的“对象”所束缚的。以前问过,SQLHelp为什么要写成静态函数的形式,答曰:数据访问是一个对象吗?怎么实例化呢?

  我觉得数据库就是一个对象,数据访问也是一个对象。数据访问就是数据库的一个“代言人”。我的数据访问函数库就是以DbCommand为中心人物,用起来非常的方便。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PHP在线

5个经典的JavaScript面试题

在IT界中公司对JavaScript开发者的要求还是比较高的,但是如果JavaScript开 发者的技能和经验都达到了一定的级别,那他们还是很容易跳到优秀的公司...

38580
来自专栏杨建荣的学习笔记

对一道if-else相关的程序题的简单分析(r5笔记第45天)

今天同事在微信群里提出了一个问题,看似是一个面试题。 大体的意思就是补充下面if条件使得输出 Hello World if(){ System.out.prin...

36750
来自专栏韩伟的专栏

OO玩法:基于对象

“基于对象”的特点 什么是“基于”对象呢?就是关注“对象之间”的关系,而不是关注对象和类的关系。“面向对象编程”(OOP)的概念已经诞生了很多年,在业界可谓深入...

34840
来自专栏守候书阁

重构 - 用各种方式优化自己的函数库

最近有几天时间空闲,也是在学怎么写更有可读性的代码,更简单,方便的API。简单来说就是重构方面的内容。今天简单分享下,对以前一个小项目(ecDo,欢迎大家sta...

10810
来自专栏coding for love

JS进阶系列01-JS的弱类型和动态类型

首先,我们要弄清楚编程语言的两组划分,即弱类型和强类型,动态类型和静态类型。下面有一幅图,非常详细地说明了它们各自的定义和区别。

16130
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-day08-超市购物系统总结

Java基础-day08-超市购物系统总结 超市购物小票——自定义类 1案例介绍与演示 将超市购物小票案例中零散数据(名称、货号、单价、计价单位等)封装为货物对...

55960
来自专栏C语言及其他语言

第一个 C 语言编译器是怎样编写的?

作者: 伯乐在线 - Chaobs 网址: http://blog.jobbole.com/94311/ 首先向C语言之父Dennis Ritchie致敬! ...

49890
来自专栏数说工作室

正则表达式的“阿赖耶识”| 【SAS Says·扩展篇】正则表达式

阿赖耶识...为宇宙万有之本,含藏万有,使之存而不失,故称藏识。又因其能含藏生长万有之种子,故亦称种子识。 ——《佛光大辞典》 佛家说人有九识,除眼、耳、鼻、舌...

35030
来自专栏工科狗和生物喵

对菜鸟教程的Python一百例的个别改进

好吧,其实是小妹子Python公选课结课,所以我来帮忙做个大作业(简单到哭的大作业好吗?)!她的大作业就是老师把菜鸟教程的Python一百例扒下来做成文档,然后...

44760
来自专栏互扯程序

Java8函数式编程实践精华

现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享。

14230

扫码关注云+社区

领取腾讯云代金券