C#学习笔记(六)——面向对象编程简介

时间:2023-03-08 17:09:10

一、面向对象编程的含义

*   是一种模块化编程方法,使代码的重用性大大的增加。

*   oop技术使得项目的设计阶段需要的精力大大的增加,但是一旦对某种类型的数据表达方式达成一致,这种表达方式就可以沿用下去,直到这款应用的生命周期结束。

1、对象就是OOP应用程序的一个组成部分,这个组成部件封装了部分应用程序,这部分程序可以是一个过程、一些数据或一些更抽象的实体。对象的类型在OOP中有个特殊的名称叫做类。可以使用类来定义一个对象。

PS:术语“类”和“对象”常常被混淆,但简单的来讲就是,类是模板,而对象是模板做出来的产品

(我们将使用统一的建模语言UML语法来研究类和对象)

比如说Printer和MyPrinter来用UML区别一下类和对象

C#学习笔记(六)——面向对象编程简介

2、属性和字段

(1)可以通过属性和字段访问对象中包含的数据。这个对象数据可以用于区分不同的对象,因为同一个类的不同对象在属性和字段中存储了不同的值。

(2)属性和字段是不同的,因为属性不提供对数据的直接访问。

(3)UML图

C#学习笔记(六)——面向对象编程简介

a、可访问性:+号表示公共成员,-号表示私有成员。

b、成员名

c、成员的类型

2、方法

(1)UML图

C#学习笔记(六)——面向对象编程简介

a、其语法类似于字段和属性,但最后显示的类型是返回类型,在这一部风汇总还显示了方法的参数。

b、in、out和inout他们用于表示数据流的方向,其中out和inout大致对应与学习笔记(五)中讨论的C#关键字out和ref。in 大致对应于C#中不适用这两个关键字的情景。

3、一切皆对象

4、对象的生命周期

(1)两个重要的阶段:

a、构造阶段:对象最初进行实例化的时期。这个初始化过程称为构造阶段,由构造函数完成。

b、析构函数:在删除一个对象时,常常需要执行一些清理工作,例如释放内存,这由析构函数来完成。

(2)构造函数:

对象的初始化工程是自动完成的,但是,在初始化对象的过程中,需要初始化对象储存的数据。构造函数就是用于初始化数据的函数。

所有的类有包括一个以上的构造函数,在这些函数中:有一个默认的构造函数,该函数没有参数,名字和类名一样。类可能还包括几个带参数的构造函数,称为非默认的构造函数。代码可以使它们以许多的方式实例化对象。

在C#中,用new关键字来调用构造函数。

构造函数与字段和属性一样,可以是共有或私有的。在类外部的外码不能使用私有构造函数来实例化对象,而必须使用公共的构造函数。

(3)析构函数

不应该依赖析构函数来书房对象实例所使用的函数,因为在不再使用某个对象后,该资源会长时间被该对象占用。如果所使用的资源非常重要,这样做就有可能出问题。(后面的会有解决的办法)。

4、静态和实例类函数

(1)类还有静态成员,静态成员可以在类的实例之*享,在使用静态成员的时候甚至不需要实例化对象。

UML图表示法:

C#学习笔记(六)——面向对象编程简介

在UML图中,类的静态成员用下划线表示。

(2)静态构造函数

使用类中的静态成员时,需要预先初始化这些成员。使用静态构造函数可以执行这种初始化任务,一个雷只能有一个静态构造函数,但是构造函数不能带有访问修饰符,也不能带任何参数。

静态构造函数不能直接调用,只能在下述情况中执行:

a、创建包含静态构造函数的类实例时

b、访问含静态构造函数的类的静态成员时

(3)静态类

如果我们想类只含有静态成员,一种简单的方法就是使用静态类,而不是把类的构造函数设置为私有,静态类只能包含静态成员。

二、OOP技术

1、接口

(1)接口是把公共实例(非静态)方法和属性组合起来,以封装特定方法的集合。

(2)注意,接口不能单独存在,不能像实例化一个类那样实例化接口。另外,接口不能包含实现其成员的任何代码,而只能定义成员本身。实现过程必须在实现接口的类中完成。

(3)UML语言在对象上实现接口。(一般接口的名称一般用大写字母I开头)

C#学习笔记(六)——面向对象编程简介

(4)一个类可以支持多个接口,多个类也可以使用同一个接口。

(5)在发布接口之后(比如说我们使用的MATLAB),即接口可以用于其他开发人员或终端用户后,最好不要修改它。如果以后做了修改,也许是升级了底层的代码,但是也许会导致使用者不能正确运行接口,甚至失败,我们应创建一个新的接口,来扩展旧接口,例如可以包含一个版本号。

(6)支持IDisposable接口的对象必须实现其Dispose()方法,即他们必须提供这个方法的代码。当不再需要某个对象的时候就调用这个方法,释放重要的资源,负责,该资源会等到析构函数的时候才释放。

C#允许使用一种可以优化使用这个方法的结构。using关键字可以在代码块中初始化使用重要资源的对象,会在这个代码块的末尾自动调用Dispose()方法,用法如下:

<ClassName><VariableName> = new <ClassName>()
……
using(<VaribaleName>)
{
……
}

或者也可以:

using(<ClassName><VariableName>   =  new <ClassName>())
{
……
}

可以在using代码块中使用变量<VariableName>,并在代码块的末尾自动删除(在代码块执行完毕后,调用Dispose())。

2、继承

(1)任何类都可以从另一个类中继承,这就是说,这个类拥有他继承的类的所有成员。在OOP中,被继承(派生)的类成为父类(基类)。

Attention:注意C#中的对象只能直接派生于一个基类。

(2)UML图中来表示基类。

C#学习笔记(六)——面向对象编程简介

用一个箭头来表示继承的关系。

(2)派生类不能访问基类的私有成员,但是可以访问其公有和受保护的成员。而外部代码只能访问公有成员,而不能访问私有成员还有受保护成员。

(3)基类可以定义为抽象类,抽象类不能够直接实例化,要使用这个类,必须继承这个类,抽象类中有抽象成员,这些成员在基类中没有实现代码,这些代码的实现是在派生类中提供。

Attention:接口也可以继承自其它接口,但与类不同的是,接口可以继承多个基接口。

三、多态性

(1)多态性是指某个派生类型的变量可以赋给基本类型的变量,而不用进行强制类型转换就可以通过这个变量来调用基类的方法,但最终的结果是调用了派生类中的方法来实现代码。

(2)基本类型转换成派生类型的时候需要使用强制类型的转换。

(3)C#中,所有的类都派生于Object这类。

(4)接口的多态性:尽管接口不能实例化,但是可以建立接口类型的变量,然后就可以在支持该接口的对象上使用这个变量访问该接口提供的方法和属性。

4、对象之间的关系:

包含、集合

5、运算符重载

简而言之,就是重新定义C#中已有的运算符的法则。

6、事件:

对象可以激活事件,作为他们处理的一部分。暂时可以理解为中断、

7、引用类型和值类型

换句话说就是指针和变量。