比如我创建了6个类分别是:
A1,A2,A3,A4,A5,A,A是前面A1..5的父类。
在程序中我的子类A1..A5都有相同的几个过程或函数名称,但是实现的代码不同。我在调用的时候是否可以将子类赋值给A 比如:A:=A1
然后统一用A来调用这些函数,A父类中也有这些函数! 请高手帮忙指导!!!
A1,A2,A3,A4,A5,A,A是前面A1..5的父类。
在程序中我的子类A1..A5都有相同的几个过程或函数名称,但是实现的代码不同。我在调用的时候是否可以将子类赋值给A 比如:A:=A1
然后统一用A来调用这些函数,A父类中也有这些函数! 请高手帮忙指导!!!
不过问的都是很高难度的,不知道你是做什么工作的?
多态性比较难以理解!
它允许你将父类对象设置成为和一个或更多个它的子类对象相等的技术
也就是说parent:=child
比如说,一个父类定义了一些函数,它的所有后代都继承了这些函数。按照楼主说的,想通过父类实例来调用统一的函数,这样不是不可以,这样调用总是成功的,但是,之前赋值是必要的。这样parent才能找到正确的函数地址。(注意:不能parent不能调用parent中没有定义的函数或过程)
这里你需要了解VMT。就是虚拟方法指针列表。
如果在parent中定义了 procedure GetobjectCaption;virtual;
所有继承的子类都拥有父类在VMT中虚方法的指针列表。不知道我这么说你还能明白!
子类在继承的时候,是需要override
这里我来举例说明比较直观:
type
Tparent=class(TObject)
procedure draw;Virtual;
end;
type Tchild=class(Tobject)
procedure draw;override;
procedure draw2;virtual;
end;procedure Tparent.Draw;
begin
showmessage('parent.draw');
end;
procedure TChild.draw;
begin
showmessage('child.draw');
end;
procedure Tchild.draw2;
begin
showmessage('child.draw2');
end;
diaoyong调用的时候如:
var
P:Tparent;
C:Tchild;
begin
c:=Tchild.create;
p:=Tparent.create;
P:=C;
P.draw; //正确的,显示 child.draw;
P.draw2;//错误的,
end;
多态性与OOP的关系就好比指针与C或object pascal的关系一样。
如果你不了解指针,则好比你至少丢掉了一般的C或者object pascal语言的功能。
同样,如果你不了解多态性,你将对OOP的理解没有真正意义上的明白。这样技术的应用只能打到一半功效!