Constructeur de copie Matlab
-
05-07-2019 - |
Question
Existe-t-il un meilleur moyen de mettre en oeuvre un constructeur de copie pour matlab pour une classe dérivée du handle, autre que d'ajouter un constructeur avec une entrée et de copier explicitement ses propriétés?
obj.property1 = from.property1;
obj.property2 = from.property2;
etc.
Merci, Dani
La solution
Si vous souhaitez une solution rapide qui suppose que toutes les propriétés peuvent être copiées, jetez un coup d’œil à la fonction PROPERTIES. Voici un exemple de classe qui copie automatiquement toutes les propriétés:
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
et du code de test:
f = Foo(); [f.a Foo(f).a] % should print 2 floats with the same value.
Autres conseils
Il existe un autre moyen simple de créer des copies d’objets handle en utilisant matlab.mixin.Copyable. Si vous héritez de cette classe, vous obtiendrez une méthode de copie qui copiera toutes les propriétés pour vous.
classdef YourClass < matlab.mixin.Copyable
...
a = YourClass;
b = copy(a); % b is a copy of a
Cette méthode de copie crée une copie sans appeler de constructeurs ni définir de fonctions de propriétés. Donc, cela devrait être plus rapide. Vous pouvez également personnaliser le comportement de copie en remplaçant certaines méthodes.
Vous pouvez même utiliser
try
F.(fns{i}) = rhs.(fns{i});
end
ce qui rend la méthode plus utile