Я не думаю, что есть что-то, что будет делать именно так, как вы хотите, учитывая все ваши ограничения.
Однако я не совсем понимаю ваши нотационные проблемы. Почему вы хотите сохранить нотацию 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
edit: Я подумал о другом способе реализации этого, который проще (т.е. просто сохранить класс вашего исходного поста), но он требует, чтобы вы изменили код в других местах. Основная идея, лежащая в его основе, такая же, как и у первых, но без включения ее в сам объект (что делает объект более чистым, ИМХО).
>> q = myClass(10);
>> q.A = 15;
>> w = q;
>> w.A()
15
>> value = @()(w.A);
>> value()
15
>> w.A = 20;
>> value()
ans =
20