考虑到您的所有限制,我认为没有任何事情可以完全按照您的意愿行事。
但是,我对您的符号问题并不是很清楚。为什么在w.A
考虑value
不改变时要保留符号?保持符号w.A
相似并不是一个真正的问题。
使用一些修改后的代码,我可以产生以下执行:
>> q = myClass(10);
>> q.A = 15;
>> w = q;
>> w.A
15
>> value = w.Aref;
>> value()
15
>> w.A = 20;
>> value()
ans =
20
但是没有办法绕过这个符号value()
,因为这是实现的转折点;我认为这是最接近你想要的东西。当您使用以下代码实现时,您会得到上述行为myClass
:
classdef myClass < handle
properties
A = 1;
end
methods
function obj = myClass(val)
obj.A = val;
end
function a = Aref(obj)
a = @()(obj.A);
end
end
end
因此,您会看到该Aref
方法实际上返回了一个函数句柄,该句柄从对象中获取值。这也意味着这个引用是只读的!
另请注意,您必须先实例化一个myClass
实例,然后才能获得 的值A
(否则您将在哪里获得 的值A
?)。由于 myClass 实例存储在函数句柄中,因此该实例不必在您当前的工作空间(例如另一个函数范围)内可见value
。
这种方法的缺点是您只能获得一个只读引用,您将不得不使用调用value()
来获取实际值而不是函数句柄(这样会更改符号,但不会更改您想要保留的符号(或在至少可以通过A
在我的代码中替换Aval
并重命名Aref
为A
) 来实现。另一个缺点是解析value
可能比简单地解析变量要慢一些(这是否是一个问题取决于您对 的使用value()
)。
如果您想更改某些符号,可以通过使用相关属性来完成:
classdef myClass < handle
properties (Access=private)
Aval = 1;
end
properties (Dependent)
A;
end
methods
function obj = myClass(val)
obj.A = val;
end
function a = get.A(obj)
a = @()(obj.Aval);
end
function set.A(obj,value)
obj.Aval = value;
end
end
end
上面的等效执行由下式给出:
>> q = myClass(10);
>> q.A = 15;
>> w = q;
>> w.A()
15
>> value = w.A;
>> value()
15
>> w.A = 20;
>> value()
ans =
20
编辑:我想到了另一种实现方式,它更简单(即只保留原始帖子的类),但它需要您更改其他地方的代码。它背后的基本思想与第一个相同,但没有将其封装在对象本身中(这使得对象更干净,恕我直言)。
>> q = myClass(10);
>> q.A = 15;
>> w = q;
>> w.A()
15
>> value = @()(w.A);
>> value()
15
>> w.A = 20;
>> value()
ans =
20