C#入门面向对象编程(OOP概念、原则、特性)
一、通过实例比较程序编写的两种思想
1、程序的基本概念
(1)生活化理解:人们完成一件事情,并得到一个结果,从做事开始得到结果的步骤,就是程序。
(2)好处:对于重复性的事情,规定好步骤,孰能生巧,提高效率。
(3)计算机程序:就是通过计算机完成一个或多个任务,这个任务需要编写计算机能够执行的指令。这些指令就是程序。
程序语言:二进制机器指令;汇编语言;C语言;C++;JAVA;C#...
所有高级语言,最终都要被翻译成二进制指令(1,0)才能被计算机执行。
高级语言到低级语言的“翻译官”,已经由语言开发工程师完成了。
2、程序编写的两种思想PK
面试题目:请基于OOP,完成一个简单的计算器
(1)面向过程(OP)是以一种“过程/流程”为中心的编程思想。
方法:分析问题,总结步骤,按照一定的流程完成任务。
缺点:随着项目规模的扩大,业务复杂度提高,基于一个个函数编写,会变得非诚杂乱!
后续维护几乎无法完成,况且任务本身也不见得能完成。
适合:嵌入式开发,比如C语言。需要和硬件交互。
(2)面向对象是一种以"事物/对象"为中心的编程思想。
思考:当然任务大致有几个?我们根据需求分析,知道当前需要完成两个数相加减预算任务,我们设计一个计算器对象,然后把两个任务封装成方法。
然后,我们在主程序中,通过对象去完成这个运算任务。
好处:我们需要的任务,单独指派特定的对象,可以由更专业的人去完成,我们可以不用关心这个对象怎么实现的,我们只管使用!(封装)
对象的设计者,可以更集中的研究对象内部的实现,对象的调用者,只关心对象的使用。而不用关心对象的设计。(高内聚、低耦合)
对于项目页后续的更新、维护、基于面向对象设计程序,会变得非常简单和方便。
适用:各种规模的企业应用管理系统。
二、OOP的各种原则
1、单一职责
要求:一个对象只能做好一件事情,必须专注,职责过多,会引起代码混乱,维护麻烦。
如果一个类封装方法或属性的时候,比较多,就要考虑这些方法属性是不是属于这个对象。
2、开放封闭原则(开闭原则)
要求:需求变化时,尽量减少类的修改,而是通过扩展来完成。封闭修改,开放扩展。
3、依赖倒置原则
要求:基于接口编程,高层模块调用接口,底层模块实现接口,防止底层变化直接影响高层
4、接口隔离原则
要求:尽可能多的使用专用小接口,而不是总接口,避免接口过于复杂
5、里氏替换原则
要求:在继承关系中子类可以替换父类,虚拟机可以根据父类变量动态的找到具体的子类对象,从而实现多态。
总结:学好面向对象编程,就是要掌握面向对象编程的各种原则,方法等指导我们如何写程序。
同时学习别人总结的各种技巧、规范、经验、模式等。
三、面向对象的三大特性:
(1)封装:隐藏内部实现细节,模块开发者只关心内部实现,模块调用者,只关心接口调用。
好处:安全性保障。(避免代码外漏)、快速应用、团队协作。
应用:类是程序的基本单元。代码被封装到类里面,一个类是一个单元,是一个封装,
方法也是一定程度的封装,模块又是对类的封装。系统也在某些时候也是封装的体现。
(2)继承:复用技术。
好处:一处更新,处处使用。弊端:关联会越来越复杂。
我们自己编写的代码,一般使用继承关系的并不多。
(3)多态
概念:让一个对象的接口可以根据不同的请求,做出不同的响用。
应用:继承多态、接口多态。
四、面向对象的概念
1、对象的概念
(1)面向对象编程的目的:希望用对象的概念和方法解决复杂的程序问题。用面向对象的各种方法、原则、技巧、经验等指导程序编写。
(2)从生活中理解对象:公交车、电脑、人
(3)生活中对象概念:对象就是我们可以触及的各种事物。对象的特点:都有静态特征(描述对象是什么样子的),也有对象动态特性(对象能干什么)
(4)研究对象的目的是什么?不同的行业,不同的人员研究对象的方面是不一样的。软件开发者研究对象的目的,就是为了处理“对象数据”。
2、类的概念
(1)对象怎么研究:首先,要描述研究对象的那些特征(静态的、动态的)。其次,抽取要研究的内容,按照一定的要求组合起来
(2)类的概念:同类型对象的共同特征的组合,类是抽象的,只是一个模板而已。软件开发中共同的属性和方法被组织在一个单元中,就被称为类。
(3)抽取“学生”对象的共同特征:静态特征:姓名、年龄、班级、身份证号、联系电话...动态特征:保存个人信息、展示个人信息
3、类和对象的总结
从以下方面把类的理解简单化
(1)类规定能够存储的数据类型有哪些,能够执行的方法或者说能完成的任务是什么
(2)类的数据类型(属性)和动作(方法),是根据软件的需求分析得到的
(3)类定义仅仅是一个说明,保存在类文件中。
(4)类是一种结构化的数据类型
从以下方面把对象的理解简单化
(1)对象一类为模板,通过对象使用类里面的数据类型和方法
(2)对象在内存中
(3)对象属性使用:对象名.属性名(通过get和set方法实现)
(4)对象方法使用:对象名.方法名
(5)对象通过调用属性获取对应字段的值或给字段赋值。因此,属性是外界访问私有字段的一个入口。