发现很多面试官都喜欢问这个问题(我是学生),然而每次觉得自己在这个问题上都答得不尽人意。
我的回答往往是
它的设计上的特点是:继承、封装、多态;
从具象到抽象。属性变成变量,行为变成方法;
然而面试官似乎不是很满意,不知各路大神有没有相对优雅的回答?
有趣的问题。我也是学生,谈一些自己的理解。
面向对象有个很大的特点是,它同时把数据和行为(对数据的操作)结合起来,和现实世界的运行逻辑更相似。
为什么这么觉得,是和传统的(面向过程等等)比较而得出来的。
打个比方, C 语言对数据和行为的处理其实有点割裂,更加重视了行为。它里面没有叫「对象」的概念,而是个充满动作(函数)的世界。主要都是函数调用函数,从头执行到尾给出结果……这个世界里最主要的东西就是各种动作。
而 C++ 的「对象」就特别像一个东西,比如说一个人。它的世界是充满物体的世界。主要都是物体和物体(人和物体、人和人等等)之间发生关系,这些关系或者说碰撞导致了最后的结果……这个世界里最主要的东西就是各种物体。
物体本身是携带数据、携带功能的;物体之间发生关系,才有了世界的运行。这两点,面向对象的程序设计和现实世界更为相像。
而上述「继承、封装、多态」等特点,便也可由此来模拟现实世界更好地理解了。我随便举点例子……
继承:书 & 教材 & 计算机类教材 —— 这就是现实世界的继承关系。
封装:手机 —— 它是封装好的,当你使用它时,不必知道里面的电路逻辑。
多态:人.看(美女) & 人.看(强光) —— 参数类型不一样,执行的也不一样。
那面向对象的好处也很容易理解。一个是提高可理解性,因为对象按人类认识世界的规律呈现,符合常用思维方式;第二个就是更易于开发和维护,系统的优化很大程度上就等于对对象数据和功能的重新认识,在原有基础上修改一些东西。
哪里说的不对恳请各位批评指正……!
面向对象的思想
再用我工作中的实例回答补充下,前段时间要做一个很简单的功能,点赞
,确实是一个很简单的功能,但点赞的功能不只是一次,用户可以给其他的评论点赞,可以给文章点赞,可以给问题点赞等等,而且点赞之后可能触发一系列的事件(通知相关用户等),最初我想的有三种写法
// 1.文章被用户点赞
$article->votedBy($user);
// 2.用户给某篇文章点赞
$user->voteArticle($article);
// 3.用户伸出大拇指给某篇文章点赞
$user->thumbUp()->voteToArticle($article);
//$user->thumbUp()->voteToDiscuss($discuss);
最后我用了第三个写法,具体怎么实现,在你伸出大拇指的那一刻你就知道了。