2008-10-29 3 views
5

하나의 입력으로 생성자를 추가하고 속성을 명시 적으로 복사하는 것 이외에 handle 파생 클래스에 대한 MATLAB의 복사 구문을 구현하는 더 좋은 방법이 있습니까?Matlab 복사 생성자

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

감사합니다, 당신은 모든 속성을 복사 할 수 있습니다 가정합니다 빠른 - 및 - 더러운 솔루션을 원하는 경우 다니

+0

당신은 정교하게 할 수 있습니까? 어떤 버전의 Matlab을 사용하고 있습니까? – Azim

+0

저는 Matlab 2008a를 사용하고 있으며 클래스를 주로 참조로 사용합니다 (따라서 핸들에서 파생됩니다).하지만 때때로 값으로 전달해야합니다. classdef 요청 < 특성 가격 양 단부 RequestManager classdef 단부 – Dani

+0

< 특성 requestsHistory 단부 방법 함수 HandleRequest (이 요청) this.requestsHistory = this.requestsHistory 요청] 처리를 처리; end end end – Dani

답변

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. 
+3

생성자에서 속성을 복사하기 전에 "rhs"가 Foo 유형 (isa (rhs, 'Foo'))인지 테스트해야합니다. – Marc

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 

이 복사 방법은 생성자를 호출하거나 속성을 설정하지 않고 복사본을 만듭니다. 그래서 이것은 더 빨라야합니다. 또한 일부 메소드를 대체하여 복사 동작을 사용자 정의 할 수 있습니다.

+0

하위 클래스를 복사하려는 경우, 즉 a가 YourClass의 일부 하위 클래스의 인스턴스이지만 b가 하위 클래스가 아니기를 바란다면 (즉, 수퍼 클래스 (YourClass) 기능을 원한다면)? –

+0

이렇게하려면 메소드를 작성해야합니다. – Navan