これは基本的な実装です。各オブジェクトには親と子の配列があります。 subsasgn
を使用すると、オブジェクトとその子のプロパティを変更することができます。また、オブジェクトは一方向であるため、親のプロパティを変更したくないためです。
使用方法:我々はa.prop1 = 7;
を設定した場合
a = oneway(1,2);
b = oneway(a);
c = oneway(b);
が、その後b
がc
の変化につながるものに変更されます。直接の子のみを変更したい場合は、行31
とコメント行30
のコメントを外すことができます。
classdef oneway < handle
properties
parent
children={};
end
properties
prop1
prop2
end
methods
function obj = oneway(varargin)
if nargin == 1
a = varargin{1};
if isa(a,'oneway')
obj.prop1 = a.prop1;
obj.prop2 = a.prop2;
obj.parent = a;
a.children{end+1} = obj;
end
elseif nargin == 2
obj.prop1 = varargin{1};
obj.prop2 = varargin{2};
end
end
function obj = subsasgn(self, S, B)
if strcmp(S.type, '.')
if ismember(S.subs, properties(self))
obj = builtin('subsasgn', self, S, B);
for k = 1: numel(self.children)
self.children{k} = subsasgn(self.children{k},S,B);
%self.children{k} = builtin('subsasgn', self.children{k}, S, B);
end
end
end
end
function delete(self)
self.parent.children (cellfun(@(x)x==self,self.parent.children))=[];
for k = 1: numel(self.children)
self.children{k}.parent =[];
end
end
end
end
とてもエレガントです! – rahnema1