2017-10-23 20 views
3

저는 Matlab을 처음 접했고 "일방 통행 클래스"를 만드는 방법이 있는지 궁금합니다. 더 설명하기 위해Matlab 핸들 클래스 내에서 "단방향 종속성"을 생성하는 방법

, 나는 속성 "prop1"와 "prop2"나는 test_1 (부모) 내에서 속성에 적용된 변경 test_2에 영향을하고 싶었

test_1 = test_class(5,10) 
test_2 = test_1 

(아이)와 test_class라는 클래스를 가지고 말할 수 하지만 난 그렇게

test_1.prop1 = 20; 
test_2.prop1: 20 

test_2.prop2 = 30; 
test_1.prop2: 5 

같은 "단방향 실행 종속"을 만들 수있는 방법이 있나요, test_2의 변화가 test_1에 영향을 미칠 싶지 않아?

미리 감사드립니다.

답변

3

속성 집합 수신기를 사용하여 subasgn의 어려움없이이 작업을 수행 할 수 있습니다. 이렇게하면 모든 자녀 사본을 가지고 관리하는 업무를 수행 할 필요가 없습니다. 이것은 다음과 같이 보입니다 :

classdef test_class < matlab.mixin.Copyable 

    properties(SetObservable) 
     prop1 
     prop2 
    end 

    properties 
     prop3 
    end 

    methods 
     function obj = test_class(in1, in2, in3) 
      obj.prop1 = in1; 
      obj.prop2 = in2; 
      obj.prop3 = in3; 
     end 
     function ref = make_dependent_reference(obj) 
      ref = copy(obj); 

      cls = metaclass(obj); 
      observableProps = cls.PropertyList.findobj('SetObservable',true); 
      for ct =1:numel(observableProps) 
       obj.addlistener(observableProps(ct).Name, 'PostSet', ... 
        @(prop,evd)ref.update_dependent_reference(prop,evd)); 
      end 
     end 
    end 
    methods(Access=private) 
     function update_dependent_reference(ref, prop, evd) 
      ref.(prop.Name) = evd.AffectedObject.(prop.Name); 
     end 
    end 
end 

참고,이 SetObservable, 당신은 그 속성에 대한 참조 업데이트 내가 함께 위에 표시된 것 같은 SetObservable을하지 않은 속성을 무시하도록 선택할 수 있습니다로 등록이 필요 findobj 호출을 사용하거나 대신 모든 등록 정보에서 작업하고 SetObservable이 아닌 등록 정보에 대해 addlistener가 오류를 호출하도록 할 수 있습니다.

>> t = test_class(5,10,15) 

t = 

    test_class with properties: 

    prop1: 5 
    prop2: 10 
    prop3: 15 

>> ref = t.make_dependent_reference 

ref = 

    test_class with properties: 

    prop1: 5 
    prop2: 10 
    prop3: 15 

>> ref.prop1 = 6 

ref = 

    test_class with properties: 

    prop1: 6 
    prop2: 10 
    prop3: 15 

>> t 

t = 

    test_class with properties: 

    prop1: 5 
    prop2: 10 
    prop3: 15 

>> t.prop2 = 11 

t = 

    test_class with properties: 

    prop1: 5 
    prop2: 11 
    prop3: 15 

>> ref 

ref = 

    test_class with properties: 

    prop1: 6 
    prop2: 11 
    prop3: 15 
+0

매우 우아합니다! – rahnema1

0

나는 이것이 가능하지 않다고 생각합니다. 같은 원본 개체 (2 방향 종속)를 참조하는 핸들 개체의 복사본이나 복사본이 서로 독립적 인 값 개체를 가질 수 있습니다. Object behavior.

Property에 핸들이 포함 된 값 개체를 만들 수 있습니다. 개체 개체의 일부는 양방향이고 일부는 단방향입니다. 하지만 그건 당신이 요구 한 것이 아닙니다.

3

다음은 기본적인 구현입니다. 각 객체에는 부모 및 자식 배열이 있습니다. subsasgn을 사용하면 객체와 그 자식의 속성을 변경할 수 있으며 객체가 단방향이기 때문에 부모의 속성을 변경하지 않으려 고합니다.

사용법 :

a = oneway(1,2); 
b = oneway(a); 
c = oneway(b); 

우리가 a.prop1 = 7; 다음 bc의 변경을 초래하는 변경됩니다 설정합니다. 직접 자식 만 변경하려면 줄 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 
+0

그건 정확히 내가 필요로하는 것이지, 매력처럼 작동합니다! 정말 고맙습니다!!! –