TSL语言基础 > Object TSL > 方法

多态    

  • 多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态。编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话。
    通过继承可以实现多态。父类中调用被覆盖的方法,如果当前对象是子类的实例,那么实际调用的是子类的方法,而非父类的方法。
    {
    通过继承,一个类可以用作多种类型:可以用作它自己的类型、任何祖先类型,当把子类型当作祖先类型时,调用被覆盖的方法,实际调用的是子类本身的方法,而非基类型的方法。
    }
    考虑下面的示例:

    program test;

    type Figure = class
      Function Draw(); virtual;
      Begin
        Writeln("draw Figure");
      End;

      Function DrawAction();
      Begin
        Draw();
      End;
    End;
    Type Ellipse = class(Figure)
      Function Draw(); override;
      Begin
        Writeln("draw Ellipse");
      End;
    end;

    Begin
      F:=CreateObject("Figure");
      F.DrawAction();//输出 draw Figure
      E:=CreateObject("Ellipse");
      E.DrawAction();//输出 draw Ellipse
    End.

    考虑上面的示例:
    类Ellipse的方法Draw,重载了父类Draw这个虚方法,父类的DrawAction调用了Draw方法,当对象调用DrawAction方法时,实际上是间接调用了Draw方法。
    当父类的对象间接Draw方法时:执行的是父类的方法。
      F:=CreateObject("Figure");
      F.DrawAction();//输出 draw Figure

    当子类的对象间接用Draw方法时:执行的是子类的方法:
      E:=CreateObject("Ellipse");
      E.DrawAction();//输出 draw Ellips

    如果要强制子类调用父类的方法。需要用下面的方式:
    Class(BaseClass,SubObject).FunctionName.
    上面的事例中,
    E:=CreateObject("Ellipse");
    Class(Figure,E).Draw();
    执行的却是父类的Draw方法.输出:输出 draw Figure