【问题标题】:MATLAB CLASSES getter and settersMATLAB 类 getter 和 setter
【发布时间】:2015-01-20 13:26:22
【问题描述】:

我来自 Java 背景。我在 Matlab 中遇到类问题,尤其是 getter 和 setter。收到一条消息,说句柄和值类之间存在冲突

classdef Person
properties(Access = private)
    name;
    age; 
end


methods
    % class constructor
    function obj = Person(age,name)         
             obj.age = age;
             obj.name = name;
    end

    %getters
    function name = get.name(obj)          
    end

    function age = get.age(obj)
    end

    %setters
    function value = set.name(obj,name)
    end

    function value = set.age(obj,age)
    end

end

结束

【问题讨论】:

    标签: matlab oop matlab-class


    【解决方案1】:

    实施

    由于您的类目前是默认 Value 类的子类,因此您的 setter 需要返回修改后的对象:

    function obj = set.name(obj,name)
    end
    function obj = set.age(obj,age)
    end
    

    来自the documention:“如果将[值类]传递给函数,则函数必须返回修改后的对象。”而in particular:“在值类中,修改对象的方法......必须返回修改后的对象以复制现有的对象变量”。


    句柄类(classdef Person < handle)不需要返回修改后的对象(如返回void):

    function [] = set.name(obj,name)
    end
    function [] = set.age(obj,age)
    end
    

    值与句柄

    再深入一点,Value 类和 Handle 类的区别主要在于赋值:

    • 将 Value 类实例分配给变量会创建该类的副本。
    • 将 Handle 类实例分配给变量会创建对该实例的引用(别名)。

    Mathworks 有一个关于这个主题的good rundown。 套用他们的说明,Value 类的行为是

    % p  is an instance of Polynomial
    p = Polynomial(); 
    % p2 is also an instance of Polynomial with p's state at assignment
    p2 = p;
    

    一个句柄类是

    % db is an instance of Database
    db = Database();
    % db2 is a reference to the db instance
    db2 = db;
    

    【讨论】:

    • 使用句柄类时,不用写[] = set.name(obj,name)。只需set.name(obj,name) 就可以了。
    【解决方案2】:

    从 Java 角度看 Quick'n Dirty: - “处理”类是你的想法。带有指向它们的指针的正确对象实例。使用它们。 - “值”类总是返回任何对象的完整克隆(已被您刚刚所做的修改,例如设置名称)。

    它们在 Matlab 中都有的原因是在 Matlab 中您会期望本机的“价值”行为。假设你有一个矩阵A = [1 2; 3 4],然后通过B = A 分配它。如果你现在设置B(1) = -1 你会希望A(1) 仍然是1,对吧?这是因为 matlab 会跟踪“副本”并在您修改最初设置为同一矩阵的不同变量时真正创建它们。在 OOP 中,您现在将 A(1)=-1 作为对象引用。

    此外,“本机”matlab 例程没有“this/self/me”变量,其中包含从函数内部访问的实例引用。相反,约定是将类实例添加到函数的参数列表中。 所以对于函数调用myclass.mymethod(arg1,arg1),声明必须是

    function mymethod(this, arg1, arg2)
      % Note that the name you choose for "this" is arbitrary!
    end
    

    请注意,这是java-perspective(也是我最喜欢的),上面的函数调用相当于mymethod(myclass,arg1,arg1)。这更符合 matlab 风格,但不知何故让您更难看到您正在调用对象方法。

    现在,关于 setter/getter:对于 handle 类,现在一切都感觉是 java-ish:

    classdef MyClass < handle
    
    properties
       MyProp;
    end
    
    methods
       function set.MyProp(this, value)  %Note: setMyProp is also valid!
           ... % do checks etc, trigger calls, 
           this.MyProp = value; 
       end
    
       function value = get.MyProp(this)
           ... % notify, update, triggers etc
           value = this.MyProp; 
       end 
    end
    

    当然,如果您只想返回值,则无需定义 getter,即myclassinstance.MyProp 也可以在没有任何内容的情况下工作。

    最后,在我 7 年的 matlab oop 中,值类的 getter/setter 是 [从未遇到过我/我从来不需要] 的东西,所以我的建议是使用句柄类并享受快乐的 matlab 编码 :-) 否则,上述解释和官方 matlab 文档正在为值类 getter/setter 做这项工作。

    【讨论】:

      猜你喜欢
      • 2019-11-26
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      相关资源
      最近更新 更多