我们继续来谈一谈类 与其他面向对象的编程语言不同,.NET中类有四个基本成员,DATA MEMBERS(FIELDS), FUNCTION MEMBERS(METHODS), PROPERTIES, EVENTS。其他编程语言只有前两项。这里需注意,DATA MEMBERS(FIELDS)永远不要声明成PUBLIC,因为这样会使使用者无需知道你的类就可以改变你的数据。 PUBLIC CLASS TEST{ PRIVATE INT I; } 这里I 就是一个DATA MEMBERS(FIELDS),需要提及一点,PROPERTIES提供了方便、安全的数据访问封装。下面来谈谈FUNCTION MEMBERS(METHODS),他有两种存在方式,INSTANCE和STATIC。INSTANCE隐含的接受了指向他所在的对象的指针,在C#中你可以用对象名或THIS得到。如:SOMEOBJECT.METHOD(), 或THIS.METHOD()。静态的(STATIC)METHOD不能接收到THIS指针。因此他们不能直接访问类里的任何实例化数据。他的调用方式是SOMECLASSNAME.STATICMETHOD()。他无需例示。FUNCTION MEMBERS(METHODS)默认是PRIVATE的,即只能在声明他们的类中访问,我们需要声明他们为PUBLIC以便可以在任何类中访问。FUNCTION MEMBERS(METHODS)可以被重载,也就是说你可以创建多个就有相同名字的方法,比如说TEST(INT I), TEST(DOUBLE I), TEST(), TEST(STRING I, BOOL B).....。.NET编译器会依据你传递的参数决定你在调用哪个方法。当然还有一些其它的修饰符如EXTERN,他的用途是如果你想在.NET FRAMEWORK中声明你的方法而在.NET FRAMEWORK之外实现你的方法,比如说在C# 中声明你的方法而在WINDOWS本地DLL中实现你的方法,你就要在C#中这样声明,PUBLIC EXTERN YOURMETHOD(){} 接下来我们要谈谈CONSTRUCTORS和FINALIZE,每个类都至少有一个CONSTRUCTOR的方法,如果你没有提供,C#将自动为你生成一个没有任何参数的CONSTRUCTOR。CONSTRUCTOR是一个与你的类的名字相同且没有任何返回值的的方法。每个CONSTRUCTOR都会调用一个你基类的CONSTRUCTOR(如果没有显性的基类,就调用对象的),这个调用会在你的CONSTRUCTOR主体执行之前调用,这样,你就知道你的基类有没有正确的初始化了。CONSTRUCTOR只在每个对象被创建时调用一次,它的作用是初始化对象的实例,以便于调用。DESTRUCTORS已不再需要,因为C#会自动提供一个清理对象的方法(叫FINALIZE)。垃圾自动清理,这也是C#的区别于其他编程语言的特性之一。接下来,我们该谈谈属性了。首先为什么要用属性?来看一个例子,如果你有一个类PERSON,有一个DATA MEMBERS(FIELDS)叫AGE 是INT32型的被声明成PUBLIC,(前面我们讲过不能声明成PUBLIC,这里就是举例说明为什么不能): PERSON JIM = NEW PERSON(); // CREATE OBJECT; POINTED TO BY JIM JIM.AGE = 23; INT32 JIMSAGE = JIM.AGE; JIM.AGE = -5; // INVALID, BUT UNCHECKED IF YOU USE A FIELD 这段代码会造成两个问题 1.你的用户知道了内部数据的细节,他们可能会做一些你不希望发生的操作 2.你的用户可能会更改数据为一个不合法的值,如将AGE设为零或负数 现在大家可以知道属性的优势了,相对应予上面提的 1.用户不会知道你的内部数据结构 2.属性方法会保护数据 下面的例程显示了属性的优越。 PUBLIC CLASS PERSON { INT32 AGE; // 注意默认是PRIVATE PUBLIC PERSON(INT32 AGE) { // CONSTRUCTOR THIS.AGE = AGE; // THIS消除歧义! } PUBLIC INT32 AGE { // PROPERTY GET { RETURN AGE; } SET { // VALIDATING VALUE IF (VALUE > 0 && VALUE < 150) { AGE = VALUE; } ELSE { // THROW EXCEPTION IF INVALID VALUE THROW NEW ARGUMENTEXCEPTION("AGE MUST BE BETWEEN 1 AND 150"); } } } } 这段程序有几个值的关注的地方 1.在CONSTRUCTOR中,我们定义了一个参数也叫AGE,这会与PRIVATE AGE产生歧义。我们用THIS来消除歧义。 2.GET方法用于读取属性SET方法用于存取属性 。关键字VALUE代表属性被设置的值 3.在SET方法中我们检查了VALUE的值,并在数据不合法时抛出了异常 有点打累了。。。:) 下次我们谈谈EVENT
|