MATLAB CLASSES getter和setter

kin*_*ull 4 oop matlab matlab-class

我来自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
Run Code Online (Sandbox Code Playgroud)

结束

Tro*_*kin 6

履行

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

function obj = set.name(obj,name)
end
function obj = set.age(obj,age)
end
Run Code Online (Sandbox Code Playgroud)

文档中:"如果将[值类]传递给函数,函数必须返回修改后的对象." 并特别:"在价值类,方法......那修改的对象必须返回修改的对象在现有对象变量复制".


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

function [] = set.name(obj,name)
end
function [] = set.age(obj,age)
end
Run Code Online (Sandbox Code Playgroud)

价值与处理

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

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

Mathworks 在这个主题上有一个很好的概述.为了解释他们的插图,Value类的行为是

% p  is an instance of Polynomial
p = Polynomial(); 
% p2 is also an instance of Polynomial with p's state at assignment
p2 = p;
Run Code Online (Sandbox Code Playgroud)

和Handle类是

% db is an instance of Database
db = Database();
% db2 is a reference to the db instance
db2 = db;
Run Code Online (Sandbox Code Playgroud)

  • 使用句柄类时,不需要编写`[] = set.name(obj,name)`.只要`set.name(obj,name)`就行了. (2认同)