首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MATLAB类getter和setter

MATLAB类getter和setter
EN

Stack Overflow用户
提问于 2014-11-22 12:58:43
回答 2查看 5.1K关注 0票数 5

我来自Java背景。我对Matlab中的类有问题,特别是getter和setter。收到一条消息,上面写着句柄和值类之间的冲突,我有点不知所措,如果没有一个更好的词,任何帮助都会有帮助。

代码语言:javascript
运行
复制
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

结束

EN

回答 2

Stack Overflow用户

发布于 2014-11-22 15:41:49

实现

由于您的类当前是默认值类的子类,所以您的设置程序需要返回修改过的对象:

代码语言:javascript
运行
复制
function obj = set.name(obj,name)
end
function obj = set.age(obj,age)
end

如果将值类传递给函数,则该函数必须返回修改过的对象。和特别是:“在值类中,修改对象的方法.必须返回修改过的对象才能复制现有的对象变量”。

Handle类(classdef Person < handle)不需要返回修改过的对象(比如返回void):

代码语言:javascript
运行
复制
function [] = set.name(obj,name)
end
function [] = set.age(obj,age)
end

价值与手柄

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

  • 将值类实例分配给变量将创建该类的副本。
  • 将句柄类实例分配给变量,创建对该实例的引用(别名)。

Mathworks有一个关于这个主题的精疲力竭。套用它们的说明,值类的行为是

代码语言:javascript
运行
复制
% p  is an instance of Polynomial
p = Polynomial(); 
% p2 is also an instance of Polynomial with p's state at assignment
p2 = p;

而句柄类的

代码语言:javascript
运行
复制
% db is an instance of Database
db = Database();
% db2 is a reference to the db instance
db2 = db;
票数 8
EN

Stack Overflow用户

发布于 2015-01-30 20:36:55

从Java的角度来看,from‘n Dirty:- "handle“类是您的思维所设置的。具有指向它们的指针的适当对象实例。用它们。- "value“类总是返回任何对象的完整克隆(该对象已被您刚才所做的修改,例如设置名称)。

两者都存在于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),声明必须是

代码语言:javascript
运行
复制
function mymethod(this, arg1, arg2)
  % Note that the name you choose for "this" is arbitrary!
end

请注意,这是java透视图(也是我最喜欢的),上面的函数调用相当于mymethod(myclass,arg1,arg1)。这是matlab风格的本土化,但不知怎的,这会使您更难看到您正在调用对象方法。

现在,关于setters/getters:对于处理类,现在感觉一切都是java-ish:

代码语言:javascript
运行
复制
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也可以在没有任何值的情况下工作。

最后,值类的getter/getter在我7年的matlab oop中从来没有遇到过我/我从来没有遇到过,所以我的建议是使用句柄类并享受matlab的快乐编码:-)否则,上面的解释&官方matlab文档正在为值类getter/getter工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27077642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档