У меня возникают проблемы с пониманием поведения 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 после активного изменения этого значения по умолчанию для одного экземпляра внезапно меняет значение свойства для все экземпляров. То есть, если мы не можем изменить значение по умолчанию для одного экземпляра, не изменив значение всех экземпляров, какова цель дефолта?