Chap 8 Notes
--------------------------
1、 重复使用代码,效率高,开发速度快,出错几率小
2、 重复使用的代码块都必须设计为满足应用程序中每个要使用它的部分的要求,因此,有效的重复使用需要很好的规划
3、 应用程序将被组织为“布局”或“层”,从而是从事应用程序工作的人出现的角色的分离
4、 软件对象是一段描述真实世界某个对象的代码,它可以是实际的对象,也可以是抽象的对象。任何事物都可以用这种方式由一个软件对象来表示
5、 (1)一个对象和其他对象是有明确区分的。(2)对象有自己的属性,类似于形容词,存储此对象的数据,描述此对象的状态。(3)对象能执行的动作是用“函数”(即“方法”)描述的
6、 软件对象是这样一种软件结构,它把数据(使用属性)和函数(方法)绑定到一个自包含的单元中,其中对象的状态是由属性(存储在对象中的数据)来表示的,而对象的行为(能完成的工作)是由对象的方法(对象专有函数)来表示的
7、 面向对象的编程(Object-Oriented Programming,OOP)提供了一种重复使用代码的高效而强大的方式
8、 我们可以使用应用程序的每个单元,而不必关心每个单元内部是如何工作的(在各单元编写完毕后)。如果系统的一部分出现问题,可以只把精力关注在出现问题的单元上,而不必考虑其他的部分。这是因为每个单元都是作为独立的部分来看待的。
9、 在设计对象时,要执行某个复杂或频繁使用的功能,显示最简单、有效的接口,要屏蔽尽量多的操作细节。这个过程叫做“抽象化”。我们将最终决定每个对象需要描述的功能,而在组成模型的主体代码完成之后,我们只需要给每个单元一个输入,并接收一个输出,不用考虑每个单元内部的处理过程
10、 对象的属性:对象通过一些特性给外界展示自己,这些特性叫做属性
11、 对象的方法(函数):对象可以执行的动作称为方法。方法应总是对应于对象可以完成的工作,或处理它自己本身的属性
12、 为对象指定这些基本属性和行为,并把功能封装到对象中的过程称为“封装”。一旦封装了对象,就可以把对象当作一个完全自包含的整体,只需要考虑它的最重要的属性(存储在对象中的数据)和方法(可以使用的,修改该数据的代码)。这样可以不必一次开发好整个应用程序。
13、 .NET提供了非常多的、有效的、已经建立好的对象(.NET Framework),可以根据需要的功能和这些对象能够完成的功能来进行选择。只要知道这些对象有什么方法和属性,就不必关心它们内部的工作方式
14、 如果要创建一个全新类型的对象,就要先定义该对象的“蓝图”,这个“蓝图”就是对象的“类定义”,简称“类”。类必须描述这种类型的任何对象在内部和外部是如何工作的
15、 对象就是类的一个特定的实例。在创建新对象时(实例化时),.NET Framework提取整个类“蓝图”,并把类用做该对象的模板
16、 对象就是最终的,通过此对象内置的方法等可操作的;类是抽象的概念,类的一个特定实例就是一个对象
17、 将类的“可见性”设置为public,表示可以在代码的任何地方使用它。还有其他选项为private、protected、internal,它们规定类只能在应用程序的特定部分使用。即在类的属性定义上,如果使用了public关键字,则任何使用此类的一个实例的地方都可以访问此属性。而如果使用的是private关键字,则说明此属性只能在类的(实例的)内部,被其他属性和方法使用
18、 定义类和用类实例化对象的示例:
//下面开始创建一个“类”——Car
public class Car
{
//建立两个私有成员
private string color;
private int gear;
//建立Car类的Color属性
public string Color
{
get
{
return color;
}
set
{
color=value;
}
}
//建立Car类的Gear属性
public int Gear
{
get
{
return gear;
}
}
//建立Car类的ChangeGear()方法
public void ChangeGear(int direction)
{
if(direction<0)
gear--;
if(direction>0)
gear++;
if(gear>5)
gear=5;
if(gear<-1)
gear=-1;
}
}
//Car类定义结束
//下面开始实例化一个对象,并操作对象
void Page_Load()
{
//实例化一个Car类的对象,MyCar
//这包括声明和初始化两个过程
Car MyCar=new Car();
//设置此对象的Color属性
MyCar.Color=”Blue”;
//调用此对象的ChangeGear()方法,并传递参数
MyCar.ChangeGear(+1);
//最后输出此对象的两个属性的内容
Response. Write(MyCar.Color+”<br>”);
Response. Write(MyCar.Gear);
}
19、 在上例中应注意:
(1) 私有变量(私有实例数据成员),仅存储在特定类型的类的每个实例当中(在类的每个实例当中是私有的),仅在特定对象的一部分代码中才可见
(2) 考虑所有数据成员的值,就可以定义对象的整体状态。若同一个类的两个实例拥有的所有数据成员的值都相同,就可以说这两个对象有相同的状态
(3) 私有变量经常采用小写形式;属性名经常与其所使用的私有变量同名,且使用大写形式
(4) get和set是特定的方法(称为访问程序),分别检索(获取)和设置私有成员的值,授予访问对象的私有成员的权限。
(5) 与让用户直接操纵对象的数据成员相比,使用访问程序是一种更好的方式,它可以帮助把对象的属性定义为只读或只写,并且还可以定制代码。只要访问该属性,就会执行这些定制代码
(6) 在给属性赋值的时候,就会运行set关键字后面的代码。给属性赋的新值将传递给一个用C#关键字value指定的内部变量中,value是该变量的固有名称,不能被修改
(7) 从类定义中创建对象的过程称为“实例化”,这分为两个过程:声明和初始化
(8) 所有的“类”都是引用类型!也就是说,在声明“类”类型的变量时,并不是创建这个类,而只是创建了一个存在于堆栈上的引用!对象本身是用new运算符创建的。此时对象实例(或类实例)是由.NET Framework在堆上创建的。之后才能访问其属性,调用其方法
(9) 在声明一个int或double类型的对象时,可以直接使用它,因为像这样的值类型的内存是在编译过程中分配的
(10) 对象类型或任意一个引用类型的默认值是null。null是一个未进行初始化的对象的临时值。如果要访问这样一个未经实例化的对象的方法和属性,就会产生错误
(11) 在第一次声明对象变量时,可以把它设置为null,如Car MyCar=null;
(12) 在使用完对象实例,但希望保留变量以备将来使用时,可以把它设置为null,如MyCar=null;
(13) 所有直接写在<script>标记之间,定义为声明代码块一部分的函数,并没有放在显式的类定义当中,但是这些函数都直接作为底层Page对象的“方法”被调用了!!
20、 构造函数:与类本身同名的类方法,在类被实例化的同时被执行。它的作用是确保在创建对象时,给相关的内部成员赋予了合适的值,即把初始化这些私有成员作为实例化过程的一部分。注意在使用带参数的构造函数时,在对象初始化的时候,必须带上此构造函数需要的参数!
21、 “方法的签名”,是指“方法”定义必须接受的参数类型的特定组合。如果两个方法都接受相同个数并且相同类型的参数,就可以说它们有相同的签名。
22、 实际上,让.NET区分两个“方法”的方法就是它们的“签名”!
23、 定义两个(或几个)同名的类构造函数,但是所需的参数类型(或个数)不同(即签名不同),在实例化的时候(自动)选择最合适(参数的类型和个数都匹配)的那个构造函数,无需记忆几个不同的构造函数的方法名称。这个过程称为重载构造函数
24、 对象常常有很多个构造函数,每个构造函数都有不同的签名,以及函数的内部处理机制
25、 可以把重载构造函数的方式使用在对象的任何“方法”调用上。也就是说,若一个类中定义的多个方法有相同的功能但参数不同,就可以使用重载构造函数的方式来重载这些函数
26、 在C#中,不需要在函数定义中添加任何代码,来说明这是另一个函数的重载函数。只需保证该函数与另一个函数同名,但有不同的参数组。C#编译器会确定在运行期间调用哪个函数
27、 注意区分“重载的函数”和“重载的构造函数”!
28、 “运算符重载”功能不明白!