面向对象编程简介
面向对象编程(Object-Oriented Programming)
8.1 面向对象编程的含义
使用OOP技术,常常要使用很多代码模块,每个模块都提供特定的功能,每个模块都是孤立的。
OOP技术要使用对象
8.1.1 对象的含义
对象非常类似于本书前面讨论的结构类型
建模语言(Unified Modeling Language)UML研究类和对象
顶部:类名(对象名)
第二部分:属性和字段(+表示公有,-表示私有)
第三部分:方法
如:
CupOfCoffee
------------------------------
+BeanType:string
+Instant:bool
+Milk:bool
+Sugar:byte
+Description:string
------------------------------
+AddSugar(in amount:byte):byte
PS:类的静态成员带有下划线
1. 属性和字段
属性:面向对象,定义get和set
字段:类的内部使用
可以通过使用属性和字段访问对象中包含的数据。这个对象数据可以用于区分不同的对象,因为同一个类的不同对象在属性和字段中存储了不同的值。
8.1.2 一切皆对象
C#和.NET Framework中所有东西都是对象。
点字符串把对象实例名和属性或方法分隔开来,方法后面的()把方法和属性区分开来
8.1.3 对象的生命周期
构造阶段:第一次实例化对象时,需要初始化该对象。这个过程称为构造阶段,由构造函数完成。
析构阶段:在删除一个对象时,常常需要执行一些清理工作,例如,释放内存,有析构函数完成
1.构造函数
用于初始化数据的函数,所有的类定义都至少包含一个构造函数
8.1.4 静态和实例类成员
使用静态成员时,不用实例化对象
静态类智能包含静态成员
8.2 OOP技术
8.2.1接口
接口是把公共实例(非静态)方法和属性组合起来,以封装特定功能的一个集合。一个类可以实现多个接口
接口不能实例化,不能包含其他成员的代码,实现过程必须在接口中的类完成。接口的命名一般以I开头
在UML中,接口用棒棒糖来表示
如---0 IHotDrink
可删除对象
IDisposable可删除对象,必须实现Dispose()方法
using(删除对象变量)
{
//code...
}
8.2.2继承
任何类都可以从另一个类中继承
猫和狗都继承于动物类,在uml中用箭头表示继承
protected:只有继承了这个类才可以使用这个成员
抽象类:是对类一个抽象,在uml中用斜体表示
所有对象都有一个基类object
8.2.3 多态性
继承的一个结果是派生于基类的类在方法和属性上有一定的重叠,因此,可以使用相同的语法处理同一个基类实例化的对象。
接口多态性
有点像js里的,属性用构造函数定义,方法用原型定义,即,方法用接口实现,即使不一样的类都可以使用。
8.2.4 对象之间的关系
包含关系:一个类包含另一个类。这类似于继承关系,但包含类可以控制对被包含类的成员的访问,甚至在使用被包含类的成员前进行其他处理
集合关系:一个类作用另一个类的多个实例的容器。这类似于对象数组,但集合具有其他功能,包含索引、排序、和重新设置大小等。
8.2.5 运算符重载
详见13章
8.2.6 事件
详见13章
8.2.7 引用类型和值类型
值类型总是包含一个值,而引用类型可以是null
值类型:int、结构、枚举
引用类型:object、string、数组
习题知识点
1.OOP中有真实级别的可访问性:public、private、protected
2."必须手动调用对象的析构函数,否则就会浪费内存"的说法正确吗?
答:错误,永远都不用手工调用对象的析构函数,.NET运行库环境会在垃圾回收过程中自动完成该任务。但是,如果想要在A释放时,在B中记录A对象的数量之类,
可以在A类的析构函数更新A在B中的数量。
3在调用类的静态方法时,需要创建该类的对象吗?
不需要
5.假设有一个基类:HotDrink,有方法AddMilk()和Drink(),又有一个接口ICup,有一个Wash()的方法
然后有一个类继承了HotDrink和ICup
static void ManipulateDrink(HotDrink drink)
{
drink.AddMilk();//从基类继承而来
drink.Drink();//从基类继承而来
if(drink is ICup)
{
ICup cupInterfase=drink as ICup;//声明接口
cupInterfase.Wash();//调用接口方法
}
}
面向对象编程(Object-Oriented Programming)
8.1 面向对象编程的含义
使用OOP技术,常常要使用很多代码模块,每个模块都提供特定的功能,每个模块都是孤立的。
OOP技术要使用对象
8.1.1 对象的含义
对象非常类似于本书前面讨论的结构类型
建模语言(Unified Modeling Language)UML研究类和对象
顶部:类名(对象名)
第二部分:属性和字段(+表示公有,-表示私有)
第三部分:方法
如:
CupOfCoffee
------------------------------
+BeanType:string
+Instant:bool
+Milk:bool
+Sugar:byte
+Description:string
------------------------------
+AddSugar(in amount:byte):byte
PS:类的静态成员带有下划线
1. 属性和字段
属性:面向对象,定义get和set
字段:类的内部使用
可以通过使用属性和字段访问对象中包含的数据。这个对象数据可以用于区分不同的对象,因为同一个类的不同对象在属性和字段中存储了不同的值。
8.1.2 一切皆对象
C#和.NET Framework中所有东西都是对象。
点字符串把对象实例名和属性或方法分隔开来,方法后面的()把方法和属性区分开来
8.1.3 对象的生命周期
构造阶段:第一次实例化对象时,需要初始化该对象。这个过程称为构造阶段,由构造函数完成。
析构阶段:在删除一个对象时,常常需要执行一些清理工作,例如,释放内存,有析构函数完成
1.构造函数
用于初始化数据的函数,所有的类定义都至少包含一个构造函数
8.1.4 静态和实例类成员
使用静态成员时,不用实例化对象
静态类智能包含静态成员
8.2 OOP技术
8.2.1接口
接口是把公共实例(非静态)方法和属性组合起来,以封装特定功能的一个集合。一个类可以实现多个接口
接口不能实例化,不能包含其他成员的代码,实现过程必须在接口中的类完成。接口的命名一般以I开头
在UML中,接口用棒棒糖来表示
如---0 IHotDrink
可删除对象
IDisposable可删除对象,必须实现Dispose()方法
using(删除对象变量)
{
//code...
}
8.2.2继承
任何类都可以从另一个类中继承
猫和狗都继承于动物类,在uml中用箭头表示继承
protected:只有继承了这个类才可以使用这个成员
抽象类:是对类一个抽象,在uml中用斜体表示
所有对象都有一个基类object
8.2.3 多态性
继承的一个结果是派生于基类的类在方法和属性上有一定的重叠,因此,可以使用相同的语法处理同一个基类实例化的对象。
接口多态性
有点像js里的,属性用构造函数定义,方法用原型定义,即,方法用接口实现,即使不一样的类都可以使用。
8.2.4 对象之间的关系
包含关系:一个类包含另一个类。这类似于继承关系,但包含类可以控制对被包含类的成员的访问,甚至在使用被包含类的成员前进行其他处理
集合关系:一个类作用另一个类的多个实例的容器。这类似于对象数组,但集合具有其他功能,包含索引、排序、和重新设置大小等。
8.2.5 运算符重载
详见13章
8.2.6 事件
详见13章
8.2.7 引用类型和值类型
值类型总是包含一个值,而引用类型可以是null
值类型:int、结构、枚举
引用类型:object、string、数组
习题知识点
1.OOP中有真实级别的可访问性:public、private、protected
2."必须手动调用对象的析构函数,否则就会浪费内存"的说法正确吗?
答:错误,永远都不用手工调用对象的析构函数,.NET运行库环境会在垃圾回收过程中自动完成该任务。但是,如果想要在A释放时,在B中记录A对象的数量之类,
可以在A类的析构函数更新A在B中的数量。
3在调用类的静态方法时,需要创建该类的对象吗?
不需要
5.假设有一个基类:HotDrink,有方法AddMilk()和Drink(),又有一个接口ICup,有一个Wash()的方法
然后有一个类继承了HotDrink和ICup
static void ManipulateDrink(HotDrink drink)
{
drink.AddMilk();//从基类继承而来
drink.Drink();//从基类继承而来
if(drink is ICup)
{
ICup cupInterfase=drink as ICup;//声明接口
cupInterfase.Wash();//调用接口方法
}
}