.NET边学边讲(二)
你当前的位置:烁空 --> 技术文档全集
我们继续来谈一谈类
与其他面向对象的编程语言不同,.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