#matlab #properties #attributes #private-members
#matlab #свойства #атрибуты #private-члены
Вопрос:
В классе A есть зависимые свойства, основанные на аргументе в конструкторе, я хочу сделать некоторые свойства скрытыми, чтобы пользователь не смог установить / получить эти свойства.
classdef A
properties (Dependent = true)
prop1
prop2
end
methods
function value = get.prop1(obj)
...
end
function value = get.prop2(obj)
...
end
end
methods(Access = public)
function obj = A(arg1)
if arg1 == 1
% make prop1 Hidden for the constructed object
end
end
end
end
и вот примеры использования:
a1 = A(2);
a1.prop1; % ok
a2 = A(1);
a2.prop1; % problem, user will not know about existence prop1
Комментарии:
1. Откуда у вас эта идея? Я никогда не видел язык ООП, который позволяет динамически изменять атрибуты свойств (если вы не учитываете отражение, которое, я думаю, не подходит для классов MATLAB). Как упоминалось NewEyes, я бы просто выбрал 2 разных класса.
2. @Dev-iL в Smalltalk, одном из корневых OO-языков, все определяется динамически, классы и методы
3. @Dev-iL Я знаю об ООП. Я могу решить с помощью классов, конечно. Но я пытаюсь найти решение, отличное от OO. Кроме того, MATLAB отличается от других OO-языков. Согласно некоторым мнениям, MATLAB — это язык сценариев. Итак, я хочу использовать скриптовую часть MATLAB.
4. В MATLAB вы можете динамически создавать свойства и назначать им атрибуты, nl.mathworks.com/help/matlab/matlab_oop /… . Что я ищу, так это то, возможно ли то же самое с нединамическими свойствами или нет?
Ответ №1:
Access
Уровень фиксирован, как и в любом языке ООП, который я знаю. Это фундаментально для того, как класс взаимодействует с другим кодом.
Ваш единственный обходной путь — использовать Dependent
свойства matlab.mixin.SetGet
класса типа и иметь условное поведение, основанное на аргументе построения. Вот POC
класс для демонстрации:
Класс:
classdef POC < matlab.mixin.SetGet
properties ( Dependent = true )
prop
end
properties ( Access = private )
arg % Construction argument to dictate obj.prop behaviour
prop_ % Private stored value of prop
end
methods
function obj = POC( arg )
% constructor
obj.prop = 'some value'; % Could skip setting this if argCheck fails
obj.arg = arg;
end
% Setter and getter for "prop" property do obj.argCheck() first.
% This throws an error if the user isn't permitted to set/get obj.prop
function p = get.prop( obj )
obj.argCheck();
p = obj.prop_;
end
function set.prop( obj, p )
obj.argCheck();
obj.prop_ = p;
end
end
methods ( Access = private )
function argCheck( obj )
% This function errors if the property isn't accessible
if obj.arg == 1
error( 'Property "prop" not accessible when POC.arg == 1' );
end
end
end
end
Вывод
>> A = POC(1);
l>> A.prop
Error using POC/get.prop (line 17)
Property "prop" not accessible when POC.arg == 1
>> A = POC(2);
>> A.prop
ans =
'some value'
Ответ №2:
Редактировать: я бы создал два разных класса, один со скрытыми, а другой с видимыми атрибутами.
В этом случае вы можете просто установить соответствующие атрибуты свойства в скрытом классе. Это должно сделать это:
properties (Dependent = true, Hidden = True, GetAccess=private, SetAccess=private)
Комментарии:
1. Если arg1 не равен 1, то все свойства будут видны пользователю. После ввода имени объекта пользователь увидит все свойства с завершением вкладки. В вашем решении они будут скрыты независимо от arg1 в конструкторе.
2. А, ладно, теперь я понимаю! Почему бы вам просто не использовать 2 разных класса для каждого случая?
3. Вы правы, но я не хочу создавать классы по разным причинам. У меня есть десятки свойств (не только два), я привел всего лишь простой пример, чтобы кратко показать мою проблему.
4. Даже если у вас много свойств, которые все еще просто сочетают ctrl c и ctrl v и изменяют одну строку. Существуют ли другие сложности, о которых вы пока не упоминали?
5. @NewEyes Существует множество причин, по которым несколько похожих классов менее предпочтительны по сравнению с одним гибким классом. Что, если вы хотите изменить способ работы функции? Теперь вам нужно отредактировать это во многих файлах классов. Я думаю, что есть лучшие обходные пути, или OP следует подумать, почему они хотят достичь этой функциональности и сделать что-то другое.