面向对象编程的含义
- OOP技术以结构、数据的含义以及数据和数据之间的交互操作为基础
- 类是用于实例化对象的类型定义
对象的含义
属性和字段
属性是提供数据限制访问功能的字段
方法
对象中的函数
- 可以是公有,也可以是私有
一切且对象
C# 与 .NET Framework 中的所有东西都是对象
对象的生命周期
构造阶段
- 第一次实例化对象
- 使用构造函数实现
- 每个类至少包含一个构造函数,构造函数名与类名相同
- 可以有多个不同参数的构造函数,但只有一个没参数的默认构造函数
- 使用 new 来调用构造函数
- 可以用 public 与 priate 修辞,但只 public 可以在外部访问实例化对象
CupOfCoffee myCup = new CupOfCoffee(); // 默认构造函数
CupOfCoffee myCup = new CupOfCoffee("Blue Mountian");
析构阶段
- 对象删除
- 使用析构函数实现
- 可以不定义,而使用默认析构函数
静态成员和实例类成员
- 静态方法、静态属性、静态字段
- 静态成员可以在类的实例之间共享
- 使用静态成员时,甚至不需要实例化对象
静态构造函数
- 一个类只有一个
- 不能直接调用
- 不能有访问修饰符,也不能带参数
- 无论创建多少类实例,其静态构造函数都只调用一次
- 调用时机:(1)创建包含静态构造函数的类实例时;(2)访问包含静态构造函数的类的静态成员时。
静态类
- 只能包含静态成员
- 不能实例化
OOP技术
接口
- 在类上关现公共属性和方法的集体
- 只包含方法和属性的定义
- 不能单独存在
- 不能实例化,由类实现接口后才能实例化
- 不能包含成员代码
- 一般以 大写字母 I 可头来定义接口的名字
- 一个类可能支持多个接口,多个类也可以支持相同的接口
- 接口发布后,最好不要修改。应创建新接口来扩展旧接口,包含版本号
可删除的对象
- 实现IDisposable接口的对象,必须实现 Dispose() 方法
- 对象不再使用时,系统会自动回收资源
// using 代码块执行结束后,会自动触发 Dispose 方法,回收资源
<ClassName> <VariableName> = new <ClassName>();
...
using (<VariableName>)
{
...
}
using (<ClassName> <VariableName> = new <ClassName>())
{
...
}
继承
- 任何类都可以从另一个类继承
- 被继承的类称为父类或基类
- C# 对象只支持直接派生于一个基类
- 派生类不能访问基类的私有成员 private,但可以访问公有成员 public
- protected 可由派生类访问,而不能由外部代码访问
- 派生类可重写基类的成员,基类原生成员仍然存在,也可以调用
- 基类可以为抽象类,但派生类必须实现抽象类的所有成员
- C# 所有类都有一个共同的基类 object (System.Object的别名)
- 接口也可以继承自其他接口,并且支持多个
多态性
- 从一个派生类实例化的所有对象都可以看成其父类的实例
接口的多态性
- 可定义接口类型的变量,然后可以支持该接口的对象上,使用这个变量访问该接口提供的方法与属性
Cow myCow = new Cow();
Chicken myChicken = new Chicken();
IConsume consumeInterface;
consumeInterface = myCow;
consumeInterface.EatFood();
consumeInterface = myChicken;
consumeInterface.EatFood();
- 派生类会继承基类的接口
- 有共同基类的类不一定有共同接口,反之亦然
对象之间的关系
对象可包含其他对象,也可以表示其他对象的集合
包含关系
集合关系
运算符重载
- 要在表达式中处理对象,常常需要通过运算符重载,定义运算符如何处理对象
- 只能重载C#运算符,而不能创建新的运算符
事件
- 对象可以提供事件,事件因某种内部处理而被触发
引用类型和值类型
- 值类型在内存的同一处存储它们自己和它们的内容
- 引用类型存储指向内存中其他某个位置的引用
- 值类型总是包含一个值,引用类型可以是 null
- 但可使用可空类型创建值类型