在学习OOP之前我们首先要对OOP的概念进行了解,其次要理解对象的属性和方法。
学习的前期铺垫:C#语法-->Winform开发基础-->UI设计
一、面向对象的快速理解
1、为什么要学习OOP
A:在C# Java等这些完全面向对象编程语言的世界中必须要掌握面向对象编程的方法。
2、什么是OOP
A:我们在使用面向对象编程语言写程序的时候必须以对象为中心,进行思考和设计。换句话来说就是把我们要完成的各种任务以对象为基础单元进行划分,也就是类的形式。
PS:最早的编程语言都是面向过程的,因为最开始程序的规模都不是很大,都是用各种函数按照一定的逻辑进行执行和中断服务子程序执行的,但是随着项目规模的增大我们以前的得方式就变得无法满足系统要求了,必须对系统进行“类的划分”以类为单元封装对应的数据和功能。举例来说汽车生产厂商生产汽车的时候就是典型的以对象为中心,这样做的好处是分工明确、专注于某一部分,扩展方便。
3、我们怎么学习OOP
A:我们学习OOP主要就是学习OOP的各项原则、方法、技巧模式和经验
原则:原则是告诉我们类的边界是如何界定的,关系是如何确定的,扩展是怎么实现的、效率是如何提升的。
PS:在设计的过程中要根据职责明确原则将一个系统中所包含的若干个功能点划分到不同的类中。
方法:具体学习的方法没有一个所谓的总结,只有不断的学习,练习去感受属性和行为是如何封装的。
技巧:慢慢学习,慢慢体会
模式:模式是OOP编程过程中解决特定问题的一些技巧,一般代指设计模式,我们按照OOP原则开发程序的时候会遇到各种各样的问题但这些问题一般具有通用性,我们的前辈工程师们针对这些问题做了方案的整理,这个时候我们可以直接借鉴,避免重复造轮子。
经验:养成经验需要我们通过做项目形成自己的知识体系和认知,换句话来说就是我们学好之后应该具有创新能力。
4、OOP学习中的重点和难点是什么?
A1:三大特性:封装、继承、多态
封装:这个在我们的开发中最常用,天天用,时时用,封装数据,封装行为。
继承:这个特性在.NET的底层用的非常多,我们理解即可,开发中用的比较少,但非常重要,因为用得少不代表不用。
多态:多态也是处处再用,尤其是在学习高级编程的过程中,当我们分析源代码的时候会发现多态无处不在。
A2:对象的封装和设计
纯面向对象的的例子有很多跟着学习即可
5、从哪里开始学习OOP
A:从一个类的封装和一个对象的使用开始-->类的概念、类的组成、对象的使用。
总结:一个项目就是有不同的类组成的。
二、面向对象的初步实践
通过第二章第五讲的例子我们可以看出如果不使用面向对象的方式开发软件,随着功能的不断扩展和优化我们的程序代码需要不断的修改和增加,在到达一定规模的时候会显得非常乱。
好的开发设计模式
①:设计UI并对UI进行美化
②:以对象为中心进行抽象,换句话来说就是思考一下我们这个项目中有哪些对象参与这些对象应该封装什么数据和行为。
当我们把一些数据和行为独立封装之后必须要考虑数据的传递问题,数据的传递一般有两种方法,一种是通过属性,一种是通过方法参数传递。
封装成属性的话我们可以提前保存数据,封装成方法参数的时候可以随时调用随时传递。就像我们去饭店吃饭,可以当时结账也可以办理会员提前充值。
类是用来封装属性和行为的,当我们使用类中的属性和行为的时候通常都是这个类的对象形式,new一个类就是创建一个对象,系统会为这个对象所需要的存储空间在内存中开辟对应的空间。当我们使用完这个类的之后对象会被C#内置的垃圾回收器GC回收,这个是C#和C++等半面向对象编程语言的最大区别,C#中对象的清理是不需要人为干预的。
关于Windows事件的一些补充:
1、事件由事件委托和事件方法两个部分组成
//清除:事件方法(响应用户操作的)
private void btn_Clear_Click(object sender, EventArgs e)
{
this.lblResult.Text = "";
}
//事件委托
this.btn_Clear.Click += new System.EventHandler(this.btn_Clear_Click);
PS:
①:当我们删除了事件方法而没有删除对应的事件委托会报错
②:当我们删除了事件委托事件方法不会在用户操作的时候发生响应
类的组成:属性(数据结构)+方法(行为)
三、面向对象中属性的研究
1、为什么要使用属性
属性一般用来表示对象的静态特征(数据相关)为了更好的理解属性我们首先使用字段封装数据。
字段的定义:定义在方法外面的变量,也被称为成员变量,当我们把字段设置为public的时候我们就可以通过《字段名.属性》的方式访问字段。
使用字段的不足之处在于他可以定义成我们能够使用的任意类型,举例来说在我们的使用过程中用int来定义年龄的时候我们不希望年龄为负数而int又允许设置为负数,如果使用字段来定义年龄就会出现非法负数年龄无法过滤的情况。要解决这个问题我们可以用属性封装字段,把字段变成私有然后通过公有的属性区操作这个字段。
通过添加公有的属性我们可以发现属性既可以操作单个的字段也可以操作其它的属性和行为的调用。
2、字段和属性怎么选择
①:选择的标准,首先要看是内部使用还是外部使用,字段一般只在内部使用,很少在外部使用。
②:属性可以内部使用也可以外部使用当我们定义的是一个变量不需要外部使用就没必要使用属性。
属性本身只是访问访问内部数据的一个接口它本身不保存数据。数据还是放到私有字段里边的,另外属性也可以不操作私有的数据。
四、对象的研究
方法:主要是封装功能点的,我们开发软件,主要是写各种方法。
1、方法定义,要特别的注意返回值和参数。
返回值:就是这个方法执行完以后,给调用者返回什么样的数据!(基础数据类型的数据、实体对象、集合对象)
基础数据类型的数据(普通的基础类型外,还有后面针对web服务开发的json数据等)
参数:就是我们调用这个方法,需要的数据。
2、实例方法和静态方法
【1】没有参数、没有返回值:通常用于初始化的操作。例如:private void InitializeComponent(){}
【2】没有返回值,有参数:通常我们完成一个任务,就结束了。(这个我们自己定义的时候,通常是定时任务等)最多见到的就是事件方法。例如:Console.WriteLine()
【3】有返回值、没有参数 :用的不多。一般就是用于一些固定的任务。比如,我们每天晚上11点,系统要做一些数据分析…
【4】有返回值,有参数:用的最多。
【5】参数带默认值的方法:前面带参数情况的特殊使用(用的非常多)比如我们后面讲ADO.NET相关方法的时候,经常用。使用参数默认值好处:配合方法重载非常方便。
【6】命名参数:这个是对多个参数传递的时候,可以打破顺序,让调用更清晰。可以适当使用。(web,mvc的路由参数)使用参数命名好处,可以根据参数名称去对应参数值。
【7】静态方法:一般用的很少,除非我们访问非常频繁,但是又不容易产生并发的情况下,可以适当使用。或者程序运行的一开始我们就希望这个方法存在,可以使用静态方法。记住静态方法不收GC(垃圾回收机制)约束,只有程序关闭,内存才是方法。(静态成员也是一样的。)
3、构造方法
【1】作用:在对象创建过程中,用于初始化对象的。
【2】使用:必须和类名一样,并且不能有返回值,当我们new的时候,new关键字后面的其实就是一个构造方法。也就是说,我们创建一个对象,就是通过调用它的构造方法完成。
【3】可以初始化哪些内容?
无参数的构造方法:通常是初始化固定的内容。(比如固定的成员变量数据、调用配置文件数等)
有参数的构造方法:主要是根据参数初始化对象的成员,或者完成其他逻辑的调用(典型的,我们在学员管理系统中,比如用户选择一行学员信息,当我们查询学员详细的时候,我们可以把当前行学员的ID传到一个新的窗体中,然后新的窗体接收到,再去查询数据库,然后展示)。
【4】构造方法之间的调用:使用 : this 关键字,后面我们学习继承的时候,还会用到:base()
this关键字:
【1】用到构造方法内部调用。
【2】通过this关键字可以调用成员变量。(也可以不用,但是)
【3】如果一个方法中的参数名称和成员变量名称一样,通过this可以很好的区分。
因为如果我们不带着this,当我们使用一个成员变量的时候,会采用就近原则。
this不能调用静态成员。(this表示当前类的实例)
学员问题:有了GC,析构函数还有用吗?
GC:是负责回收对象的(释放对象占用的各种资源)
析构函数:和构造函数是对应的。构造函数是对象创建的时候调用的。析构函数是GC回收的时候使用的。
也就说如果我们希望GC在回收对象的时候,做一些事情,可以使用析构函数。
作者:晨岩
本站所有文章除特别声明外,均采用 BY-NC-SA 4.0 许可协议。转载请注明出处!