感觉题主想要一个简单明确的答复,这个问题确实可以简单说明白。
抛开表象看本质。从本质概念上讲,面向对象大致有两个层次的内涵:
1、基于对象。就是题主所说的,只要把数据和函数放在一起就可以了。(外加普通的“继承”,不考虑多态的简单继承还算是基于对象的。)
2、多态。首先,方法可以在子类中重写;调用对象方法的时候,调用父类还是子类还是孙类的方法,能否自动选择到合适的呢?解决这个问题的设计就是“多态”。
实际上“基于对象”最重要、最常用、最根本。讨论问题本质的时候,甚至可以先不管多态。多态虽然很有用,但是如果把二者放在一起讨论,反而只会捣乱。
也就是说,要想理解透、用好面向对象,关键要理解透、用好基于对象,而这恰恰就是题主所说的,只要把属性和方法正确封装好,事情就成功了大半。
1、面向对象思想,有它很朴素、很自然的一面
我们常习惯说C语言是面向过程的语言,其实这话不大对,C语言完全可以写出面向对象的代码。因为C语言至少满足“把数据和方法封装在一起”这个基本要求,也有稍微高级点的写法实现继承和多态。
只要是写过一些实际代码的人应该都知道,无论编程语言如何简化,有一个基本功能肯定会用到——那就是把数据打包在一起。比如2D坐标需要把x和y放一起,复数需要把实部和虚部放一起,网购订单需要把单号、内容和价格放一起。
甚至退一步,回到1980年代的某些古老版本的C语言(结构体里不放函数),依然能写出符合面向对象思想的代码:
// C语言例子structStudent{char*name;//姓名intnum;//学号intage;//年龄chargroup;//所在学习小组floatscore;//成绩};char*GetStudentName(structStudent*stu){// 略}voidSetStudentName(structStudent*stu,char*newName){// 略}intmain(){structStudents1,s2,s3,s4;// 创建了多个学生SetStudentName(&s1,"小明");SetStudentName(&s2,"小红");return0;}
也就是说,基于对象本质是一个非常非常自然的概念。有了class或者struct,才能把数据放在一