【问题标题】:Class for A = K * B in MATLAB (non-dependent properties with dependent behavior)MATLAB 中 A = K * B 的类(具有依赖行为的非依赖属性)
【发布时间】:2016-01-08 14:08:39
【问题描述】:

我想为函数 A = K * B 实现一个类,其中所有属性都是不相关的。但是,我想在其他属性之一更改时动态更改属性。

我从一个非常简单的课程开始,最终得到以下内容。是否有更简单或更强大的方法(例如软件模式,使用特殊的设置/获取方法等)在 MATLAB 中执行此操作? (MATLAB 在 setter 函数中给出了很多警告)

classdef AeqKxB
    properties
        A
        B
        K
        Kstate
    end

    properties (Access = private)
        i   %  i=0 during construnction, i=1 normal operation
        ia  %  ia = 1 to trick the setter function of B
        ib  %  ib = 1 to trick the setter function of A
    end

    methods

        function obj = MyClass2(a, k, kstate)  %   Constructor
            obj.i = 0;  %  Construction starts
            obj.A = a;
            obj.B = obj.A*k;
            obj.K = k;
            obj.Kstate = kstate;

            obj.i = 1;  %  Construction complete, ready for normal operation
            obj.ia = 0; %  Do not trick Set.B function for now
            obj.ib = 0; %  Do not trick Set.A function for now
        end

        function obj = set.A(obj, a) %   setter for A
            if obj.i == 0 %  During construnction use normal operation
                obj.A = a;
            elseif obj.i == 1 %  After construction

                if obj.ia == 0 && obj.ib == 0
                    obj.A = a;
                    obj.ia = 1;               %  Get ready to Trick Set.B function
                    obj.B = obj.A / obj.K;
                    obj.ia = 0;               %  Trick finished, return to original
                elseif obj.ia == 0 && obj.ib == 1
                    %  Tricked Set.A function
                    obj.A = a;
                end

            end
        end

        function obj = set.B(obj, b) %  setter for B
            if obj.i == 0 %  During construnction use normal operation
                obj.B = b;
            elseif obj.i == 1 %  After construction

                if obj.ia == 0 && obj.ib == 0;
                    obj.B = b;
                    obj.ib = 1;               %  Get ready to Trick Set.A function
                    obj.A = obj.B * obj.K;
                    obj.ib = 0;               %  Trick finished, return to original
                elseif obj.ia == 1 && obj.ib == 0;
                    %  Tricked Set.B function
                    obj.B = b;
                end

            end
        end

        function obj = set.K(obj,k) %  setter for K
            if obj.i == 0
                obj.K = k;
            elseif obj.i == 1
                if strcmp(obj.Kstate, 'FixB')
                    obj.K = k;
                    obj.A = obj.B * obj.K;
                elseif strcmp(obj.Kstate, 'FixA')
                    obj.K = k;
                    obj.B = obj.A / obj.K;
                end
            end
        end

        function obj = set.Kstate(obj,kstate)
            obj.Kstate = kstate;
        end

    end

end

【问题讨论】:

    标签: matlab class oop set


    【解决方案1】:

    问题已回答here。我发布了他的回复:

    “所有属性都是不依赖的”为什么?你的属性显然是依赖的,所以为什么不使用它们呢。

    警告告诉您,如果将对象保存在 mat 文件中,由于随机初始化顺序,它可能无法正确恢复。实际上,对于您的设计,这应该不是问题,因为属性的值应该始终保持一致,所以我想您可以禁用警告。

    但是,我不禁非常不喜欢这种设计,尤其是 i 状态变量。您可以使用因变量实现更简洁的设计,而不会影响性能:

    classdef AeqKxB
        properties(Dependent)
            A;
            B;
            K;
        end
        properties
            Kstate;
        end
          properties (Access = private)
              A_;
              B_;
              K_;
          end
          methods
               function obj = AeqKxB(a, k, kstate)  %   Constructor
                  obj.A_ = a;
                  obj.B_ = a*k;
                  obj.K_ = k;
                  obj.Kstate = kstate;
              end
              function a = get.A(obj)
                  a = obj.A_;
              end
              function obj = set.A(obj, a) %   setter for A
                 obj.A_ = a;
                 obj.B_ = a / obj.K_;
              end
              function b = get.B(obj)
                  b = obj.B_;
              end
              function obj = set.B(obj, b) %  setter for B
                  obj.B_ = b;
                  obj.A_ = b * obj.K_;
              end
              function obj = set.K(obj,k) %  setter for K
                  obj.K_ = k;
                  if strcmp(obj.Kstate, 'FixB')
                      obj.A_ = obj.B_ * k;
                  elseif strcmp(obj.Kstate, 'FixA')
                      obj.B_ = obj.A_ / k;
                  end
              end
              function obj = set.Kstate(obj,kstate)
                  obj.Kstate = kstate;
              end
          end
      end  
    

    【讨论】:

      猜你喜欢
      • 2019-08-13
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 2011-03-31
      • 2015-08-08
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      相关资源
      最近更新 更多