Почему Matlab изменяет значение всех объектов, которые являются свойствами основного объекта? - PullRequest
2 голосов
/ 01 ноября 2019

У меня возникают проблемы с пониманием поведения Matlab, когда дело доходит до изменения свойств объектов, которые задаются как свойства какого-либо другого объекта. В частности, предположим, у меня есть три объекта: parentObject, childObject и propertyObject. Конечно, в этом простом примере эти свойства кажутся немного бессмысленными, но я пишу довольно большую программу, для которой полезно сгруппировать все соответствующие методы и свойства на этих уровнях.

Теперь мое определение этих классов показано ниже. parentObject наследуется от dynamicprops, что позволяет ему иметь интерактивно редактируемый список детей. propertyObject наследуется от dynamicprops, потому что в моей программе мне нужно иметь возможность динамически добавлять (или удалять неиспользуемые) свойства.

classdef parentObject < dynamicprops
    properties
        name 
        children = [];
    end

    methods
        function obj = parentObject(name)
            obj.name = name;
        end
        function obj = addchild(obj, childName)
            obj.children = [obj.children, childObject(childName)];
        end
    end
end
classdef childObject
    properties
        name
        someProperty(1, 1) propertyObject
    end

    methods
        function obj = childObject(name)
            obj.name = name;
        end
    end
end
classdef propertyObject < dynamicprops

    properties
        value1 = 0;
        value2 = 0;
    end
    methods

    end
end

Теперь в следующем интерактивномсеанс, я пытаюсь создать дочерние объекты и настроить одно из значений по умолчанию одного из childrenObject 'propertyObject. Я ожидаю, что один свойств, value1, из один из children изменится.

Однако это не так (см. Ниже). Смена одного из детей propertyObject автоматически заменяет и второго ребенка propertyObject. Более того, проверка того, равны ли эти два propertyObject, дает положительный результат. Я ожидаю, что создание экземпляра потомка (и, следовательно, его значение по умолчанию propertyObject) каждый раз будет давать уникальное значение propertyObjectЯ пришел из программирования на Python, и вот, насколько мне известно, - это . Может кто-нибудь объяснить мне, где я иду не так и как я могу заставить классы вести себя так, как я к ним отношусь?

>> parent = parentObject('parent')

parent = 

  parentObject with properties:

        name: 'parent'
    children: []

>> parent.addchild('child1')

ans = 

  parentObject with properties:

        name: 'parent'
    children: [1×1 childObject]

>> parent.addchild('child2')

ans = 

  parentObject with properties:

        name: 'parent'
    children: [1×2 childObject]

>> parent.children(1).someProperty

ans = 

  propertyObject with properties:

    value1: 0
    value2: 0

>> parent.children(2).someProperty

ans = 

  propertyObject with properties:

    value1: 0
    value2: 0

>> parent.children(2).someProperty.value1 = NaN

parent = 

  parentObject with properties:

        name: 'parent'
    children: [1×2 childObject]

>> parent.children(1).someProperty.value1

ans =

   NaN

>> parent.children(1).someProperty == parent.children(2).someProperty

ans =

  logical

   1

Ps, я вижу, что мой вопрос был помечен как дубликат. Тем не менее, дублированный вопрос отвечает только на часть моего вопроса;бит, который объясняет, как я могу получить желаемое поведение объекта. Хотя повторяющийся вопрос объясняет, что Matlab загружает объект / свойство по умолчанию только один раз, мне все еще не ясно, почему Matlab после активного изменения этого значения по умолчанию для одного экземпляра внезапно меняет значение свойства для все экземпляров. То есть, если мы не можем изменить значение по умолчанию для одного экземпляра, не изменив значение всех экземпляров, какова цель дефолта?

...