类的每个成员都有一个称为可见性的属性,我们称为作用域,。作用域决定了一个成员在哪些地方以及如何能被访问。TSL用下面3个关键字之一来表示它:private、protected、public
Private:表示最小的访问能力,只能在类内部的方法、属性调用,不能从类的外部调用;也不能被继承。
Protected:表示中等的访问能力,在声明它的类的模块中是随处可用的,并且在它的派生类中也是可用的。
Public:表示最大的访问能力,只要能使用类的地方都是可用的。
注:
若声明一个成员时没有指定其作用域,则它和前面的成员拥有相同的作用域.
若在类声明的开始没有指定作用域, TSL成员(包括字段、方法、属性)默认的作用域是public。
作用域关键字可以在程序中重复出现多次。
为可读性考虑,最好在声明类时用作用域来组织成员:把所有的private 成员组织在一起,接下来是所有的protected 成员,最后是public成员。用这种方法,每个可见性关键字最多出现一次,并且标明了每个新段的开始。所以,一个典型的类声明应该像下面的形式:
type
MyClass = class(BaseClass)
private
... { private declarations here}
protected
... { protected declarations here }
public
... { public declarations here }
end;
示例:
下面的代码详细说明了继承与作用域的关系
program test;
type A =class()
private
function F1();
Begin
Writeln("from private F1");
End;
protected
Function F2();
Begin
Writeln("from protected F2");
End;
public
Function F3();
Begin
Writeln("from public F3");
End;
Function F4();
Begin
Writeln("from public F4");
F1();//正确,可以在类内部的方法调用private 的成员。
F2();//正确,可以在类内部的方法调用protected的成员
F3();//正确,可以在类内部的方法调用public的成员
End;
End;
Type B = Class(A)
Function F5();
Begin
Writeln(" Inherit test :call private funciton ");
F1();//错误,不能调用基类的私有方法
End;
Function F6();
Begin
Writeln("inherit test: call protected function");
F2();//正确,调用基类的protected 方法
End;
Function F7();
Begin
Writeln("inhert test :call public function ");
F3();//正确,调用基类的public 方法
End;
End;
Begin
AA:=createobject("A");
AA.F1();//错误,不能调用类型的private方法
AA.F2();//错误,不能调用类型的protected方法
AA.F3();//正确,可以调用类型的public 方法
AA.F4();//正确,可以调用类型的public 方法,方法内部可以调用private成员.
End.