2008-10-29 157 views
5

有沒有更好的方法來實現複製構造函數爲matlab的句柄派生類,而不是添加一個輸入的構造函數並明確複製其屬性?Matlab複製構造函數

obj.property1 = from.property1; 
obj.property2 = from.property2; 

感謝, 達尼

+0

你能詳細點嗎?您使用的是什麼版本的Matlab? – Azim 2008-10-29 16:24:45

+0

我使用的是Matlab 2008a,而且我大多使用類的引用(因此從句柄派生),但有時我需要通過值來傳遞它們,例如, classdef請求<處理 性質 價格 量 端 端 – Dani 2008-10-29 16:43:06

+0

classdef RequestManager <處理 性質 requestsHistory 端 方法 功能的handleRequest(此,請求) this.requestsHistory = [this.requestsHistory請求]; 結束 結束 結束 – Dani 2008-10-29 16:46:40

回答

8

如果你想快速和骯髒的解決方案,假設所有的屬性可以被複制,看一看的屬性功能。下面是一個類的實例,可以自動將所有的屬性:

classdef Foo < handle 
    properties 
    a = 1; 
    end 
    methods 
    function F=Foo(rhs) 
     if nargin==0 
     % default constructor 
     F.a = rand(1); 
     else 
     % copy constructor 
     fns = properties(rhs); 
     for i=1:length(fns) 
      F.(fns{i}) = rhs.(fns{i}); 
     end 
     end 
    end 
    end 
end 

和一些測試代碼:

f = Foo(); [f.a Foo(f).a] % should print 2 floats with the same value. 
2

你甚至可以使用

try 
F.(fns{i}) = rhs.(fns{i}); 
end 

這使得該方法更實用

8

通過使用matlab.mixin.Copyable還有另一種簡單的方法來創建句柄對象的副本。如果你從這個類繼承,你會得到一個複製方法,它會複製你所有的屬性。

classdef YourClass < matlab.mixin.Copyable 
... 

a = YourClass; 
b = copy(a); % b is a copy of a 

此複製方法創建副本,但不調用構造函數或設置屬性的函數。所以這應該會更快。您也可以通過重寫某些方法來自定義複製行爲。