定义类,就是将该类的字段、属性、事件、方法(类中的函数和过程)封装在类的内部。这些字段、属性、事件、方法就是类的成员。就对象而言,也是对象的数据和成员。类成员的保护模式也就是类成员访问时的可见性,对于这些数据和成员的访问,有以下四种保护(访问)模式,分别使用下列关键字:
1、Private(私有的)
在Private部分声明的成员是私有的,它们只能被同一类中的方法访问。其它类是保密、封闭的,不能随总意访问它。但是,private成员保护并不严格,如果相关类的声明放在同一模块中(即同一个单元文件中),这些类就可以访问同模块的其它类的private成员。通过对私有成员的限制,可以更好地封装和保护自己的类。
2、Public(公有的)
在Public部分声明的成员是公有的,它们可以被其它类的对象实例访问引用。其成员完全可以被访问,可见性最大。虽然该成员使用方便、不受限制,但在编程中不能滥用。通常在设计中,应该保持该成员简明,并尽早定义使之稳定。因为public成员作为公共接口显然会在很多地方用到,设计不慎既会对使用该接口的其他类带来影响,又会威胁到自身类的封装性。
3、Protected(保护的)
在Protected部分声明的成员是保护性私有的,它们不仅能被同一类中的方法访问,还可由其子(派生)类中也可访问和引用。
4、Published(公布的)
在Published部分声明的成员是公有的,它们不仅能被同一类中和其子(派生)类中访问和引用,其它类中也可访问和引用。
公布属性的数据类型是受限制的。有序型、字符型、类、接口和方法指针可以被公布。当集合类型的基础类型是有序类型,且上界和下界介于0到31时,集合类型也可以公布的。集合只要符合byte、word、double word,(除了Real48外)任何实数类型都是可以公布的;而数组类型的属性(区别于数组属性)不能公布的。
一些属性虽然可以公布,但不能完全支持流系统,它们包括:记录类型的属性、所有可公布的数组属性,以及包含匿名值的枚举类型的属性。如果published属性属于上述的类型,在Object Inspector中则不能正确显示这些属性,并且使用流向磁盘操作时也不能保存它们的值。
所有的方法都是可以公布的,但一个类不能使用相同的名字公布两个或两个以上的的被重载的方法。只有当数据成员属于类或接口类型时,它才是可以公布的。
上述种种限制,是因为published声明编译器存储VMT中的信息,也就是说只有特定类型的可以存储。当用户不需要使用VMT信息时,使用public声明效果相同。
5、automated:这个关键字Delphi2以上版本已不使用,保留它,就是要与Delphi2代码相兼容。
由automated声明的类的成员,类似于public部分声明的成员。它们都是公共的,唯一区别是,由automated声明的方法和属性将生成OLE自动化操作的类型信息。
注意:Public成员和Published成员具有相同的可见性,不同之处是published成员会产生RTTI(Runtime Type Infomation,运行期类型库)。RTTI使应用程序能动态地查询一个对象的数据成员和属性,也能定位它的方法。RTTI用于在存储文件和文件导入时访问属性的值,也可用于在Object Inspector中显示属性,并且能为一些属性(即事件)关联特定的方法(即事件的处理程序)。
在Delphi中,在类声明中使用保护模式,其语法格式:
type 类名=class(基类)
Private
{字段声明}
{方法声明}
{属性声明}
Public
{字段声明}
{方法声明}
{属性声明}
Protected
{字段声明}
{方法声明}
{属性声明}
Published
{字段声明}
{方法声明}
{属性声明}
end;
注意:上述声明中,缺省保护模式关键,默认使用关键字Public。(当在{$M+}状态下编译类时,保护方式是published)。类可以有任何数目的字段,字段后跟方法和属性的声明。方法和属性的声明可以混合在一起。但是在一种保护模式中,字段的声明必须在所有方法和属性的声明之前。
在类的继承关系中,派生类可以通过重新声明来变更类成员的保护模式,但这种变更只能增加成员的可见性,不能降低它的可见性。比如,一个protected属性在派生类中能被变更为public,但不能改为private。另外,published成员在派生类中不能改为public。