2008-10-29 156 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 

此复制方法创建副本,但不调用构造函数或设置属性的函数。所以这应该会更快。您也可以通过重写某些方法来自定义复制行为。