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