2013-03-27 78 views
4

我想要一个 复制例程,它在基类中定义为虚拟,稍后在派生类中实现。 问题是,由于参数不同,不允许覆盖该过程。 有没有解决与德尔福的班级模型或我的方法是完全错误的?如何定义子类中参数不同的虚函数?

type 
    TCar = class 
    procedure CopyFrom(c: TCar); virtual; 
    end; 

    TChrysler = class(TCar) 
    FColor: Integer; 
    procedure CopyFrom(c: TChrysler); override; 
    end; 

procedure TCar.CopyFrom(c: TCar); 
begin 
    //virtual 
end; 

procedure TChrysler.CopyFrom(c: TCrysler); 
begin 
    FColor := c.FColor; 
end; 

var 
    Car1, Car2: TCar; 
begin 
    Car1 := TChrysler.Create; 
    Car2 := TChrysler.Create; 

    Car2.CopyFrom(Car1); //TChrysler.CopyFrom should be called. 
end; 
+0

您正在寻找['reintroduce'(HTTP:// docwiki .embarcadero.com/RADStudio/XE3/EN /方法#重新引入)。 – TLama 2013-03-27 23:19:13

+1

看起来像TPersistent.Assign,我讨厌它发生。 – 2013-03-27 23:19:31

+0

Delphi中的典型方法是提供'Assign'和'AssignTo'方法,你可以使用'Car2.Assign(Car1);'。如果您查看VCL源代码,可以看到许多使用此技术的示例,这些示例可以与具有新属性的派生类正常工作。例如,参见'Classes'单元中的'TStringList.Assign'。 – 2013-03-27 23:28:14

回答

5

你需要保持参数列表相同,只是做一个类型检查的实施内部:

type 
    TCar = class 
    procedure CopyFrom(c: TCar); virtual; 
    end; 

    TChrysler = class(TCar) 
    FColor: Integer; 
    procedure CopyFrom(c: TCar); override; 
    end; 

procedure TCar.CopyFrom(c: TCar); 
begin 
    //virtual 
end; 

procedure TChrysler.CopyFrom(c: TCar); 
begin 
    if c is TCrysler then 
    FColor := TCrysler(c).FColor; 
    inherited; 
end; 
+0

非常好的主意! – DelphiExorcist 2013-03-27 23:40:35

+1

@ user2217747:实际上,这几乎不是一个新主意。看看'TPersistent.Assign',它的工作原理是一样的。 – 2013-03-27 23:44:37

+0

不幸的是在编译时没有安全类型。感谢所有的答复! – DelphiExorcist 2013-03-27 23:48:51

相关问题