关于多态性,winxkm(蹩脚的程序员)和sanmaotuo(老冯)认识不同,我迷糊了,请高手指点!

                            
比如我创建了6个类分别是:   
  A1,A2,A3,A4,A5,A,A是前面A1..5的父类。  
  在程序中我的子类A1..A5都有相同的几个过程或函数名称,但是实现的代码不同。我在调用的时候是否可以将子类赋值给A   比如:A:=A1  
  然后统一用A来调用这些函数,A父类中也有这些函数!   请高手帮忙指导!!!  
   
  ×××××××××××××××××××××××××××××××××  
  winxkm(蹩脚的程序员)的观点:  
  楼上的认识我不赞同,认识多态性是非常有必要的   这是整个object   pascal语言中最重要的特征之一。特别在希望创建组件来说!  
  多态性与OOP的关系就好比指针与C或object   pascal的关系一样。  
  如果你不了解指针,则好比你至少丢掉了一般的C或者object   pascal语言的功能。  
  同样,如果你不了解多态性,你将对OOP的理解没有真正意义上的明白。这样技术的应用只能打到一半功效!  
  ××××××××××××××××××××××××××××××××××  
   
  sanmaotuo(老冯)的观点:  
  这个问题我个人觉得没有讨论的必要。虽然可以调用,但这是本目倒置的。   在VCL中就有这样处理的,但这是当时VCL设计上的缺陷造成这样处理的,严重违背了DIP(依赖倒置原则)。  
   
  这是winxkm   鳖大哥给的解释:  
   
  这是一个关于delphi中多态性的问题,不知道楼主这方面study过没有!  
  多态性比较难以理解!  
  它允许你将父类对象设置成为和一个或更多个它的子类对象相等的技术  
  也就是说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;  
   
 

查看回复