Конструктор копирования Matlab

Есть ли лучший способ реализовать конструктор копирования для Matlab для класса, производного от дескриптора, кроме добавления конструктора с одним входом и явного копирования его свойств?

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

и т. д.

Спасибо, Дэни


person Dani    schedule 29.10.2008    source источник
comment
можешь уточнить? Какую версию Матлаба вы используете?   -  person Azim J    schedule 29.10.2008
comment
Я использую Matlab 2008a и использую классы в основном по ссылке (таким образом, получая от дескриптора), но иногда мне нужно передать их по значению, например. classdef Запрос ‹ обрабатывать свойства цена количество конец конец   -  person Dani    schedule 29.10.2008
comment
classdef RequestManager ‹ обработать свойства requestHistory end методы function HandleRequest(this, request) this.requestsHistory = [this.requestsHistory request]; конец конец конец   -  person Dani    schedule 29.10.2008
comment
в порядке. У меня пока нет ответа, но я опубликую его, если что-нибудь придумаю.   -  person Azim J    schedule 29.10.2008


Ответы (3)


Если вам нужно быстрое и грязное решение, которое предполагает, что все свойства могут быть скопированы, взгляните на функцию PROPERTIES. Вот пример класса, который автоматически копирует все свойства:

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.
person Mr Fooz    schedule 29.10.2008
comment
В конструкторе вам, вероятно, следует проверить, что rhs имеет тип Foo (isa(rhs, 'Foo')) перед началом копирования свойств. - person Marc; 19.11.2009

Существует еще один простой способ создания копий объектов дескрипторов с помощью matlab.mixin.Copyable. Если вы наследуете этот класс, вы получите метод копирования, который скопирует все свойства для вас.

classdef YourClass < matlab.mixin.Copyable
...

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

Этот метод копирования создает копию без вызова конструкторов или функций набора свойств. Так что это должно быть быстрее. Вы также можете настроить поведение копирования, переопределив некоторые методы.

person Navan    schedule 23.04.2013
comment
Что делать, если вы хотите скопировать подкласс, т. е. если a является экземпляром некоторого подкласса YourClass, но вы хотите, чтобы b НЕ был подклассом (т. е. вам нужна функциональность суперкласса (YourClass))? - person alexandre iolov; 11.12.2014
comment
Вам нужно будет написать свой метод, чтобы сделать это. - person Navan; 11.12.2014

Вы даже можете использовать

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

что делает метод более полезным

person Gui    schedule 19.11.2009