2013-03-27 76 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

相關問題