2008-10-29 15 views
5

¿Existe alguna forma mejor de implementar copy construcor para matlab para una clase derivada de manejador que no sea agregar un constructor con una entrada y copiar explícitamente sus propiedades?Constructor de copia de Matlab

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

etc.

Gracias, Dani

+0

¿Puedes dar más detalles? ¿Qué versión de Matlab estás usando? – Azim

+0

Estoy usando Matlab 2008a y utilizo las clases principalmente por referencia (por lo tanto, derivando del manejador) pero a veces necesito pasarlas por valor, p. Ej. Solicitud classdef Dani

+0

classdef RequestManager Dani

Respuesta

8

Si desea una solución rápida y sucia, que asume todas las propiedades se pueden copiar, echar un vistazo a la función PROPIEDADES. He aquí un ejemplo de una clase que copia automáticamente todas las propiedades:

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 

y algo de código de prueba:

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

En el constructor, probablemente deba probar que "rhs" es de tipo Foo (isa (rhs, 'Foo')) antes de comenzar a copiar las propiedades. – Marc

2

Incluso puede utilizar

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

lo que hace el método más útil

8

Hay otra manera fácil de crear copias de los objetos de manejar mediante el uso de matlab.mixin.Copyable. Si heredas de esta clase, obtendrás un método de copia que copiará todas las propiedades por ti.

classdef YourClass < matlab.mixin.Copyable 
... 

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

Este método de copia crea una copia sin llamar a constructores o establecer funciones de propiedades. Entonces esto debería ser más rápido. También puede personalizar el comportamiento de copia anulando algunos métodos.

+0

¿Qué sucede si quiere copiar una subclase, es decir, si a es una instancia de alguna subclase de YourClass, pero quiere que b NO sea una subclase (es decir, si desea la funcionalidad de superclase (YourClass))? –

+0

Debería escribir su método para hacer esto. – Navan

Cuestiones relacionadas