TSL语言基础 > Object TSL > 类继承和作用域

作用域    

  • 类的每个成员都有一个称为可见性的属性,我们称为作用域,。作用域决定了一个成员在哪些地方以及如何能被访问。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.