#matlab #class #output
#matlab #класс #вывод
Вопрос:
Я реализовал класс в Matlab, который является производным от matlab.mixin.Копируемый. Я хочу подавить вывод окна командной строки, чтобы у пользователя не было информации о классе. Я хочу сделать это из соображений безопасности. Например:
a = myStack;
a
ans=
myStack with no properties.
Но пользователь может щелкнуть MyStack, и он предоставит информацию о классе. Я знаю, что могу перегрузить отображение для этого, но поведение, которое я хочу, выглядит следующим образом:
b = handle(1);
b
ans=
handle
Как я могу это сделать?
Спасибо.
Комментарии:
1. Имейте в виду, что
struct(a)
это раскрывает все свойства. Что именно вы хотите защитить?
Ответ №1:
Вы должны быть производными от интерфейса matlab.mixin.CustomDisplay и переопределить метод getPropertyGroups.
Для конкретной цели удаления ссылки на справку в заголовке также переопределите метод getHeader.
Примечание: Я не понимаю, как вы можете действительно обеспечить безопасность таким образом. У пользователей по-прежнему будут другие способы получения подробной информации о вашем классе. Например, meta = ?MyClass
или просто edit MyClass
, если не зашифровано с помощью pcode, или просто в редакторе просто введите myInstance.
, и пусть intellisense перечислит все не скрытые / частные методы и свойства.
Пример для отображения, которое вы хотите иметь:
classdef foo < matlab.mixin.CustomDisplay
properties
Login = 'root';
Password = '1234'
end
methods (Access = protected)
function [str] = getHeader(obj)
str = mfilename;
end
function [pg] = getPropertyGroups(obj)
pg = [];
end
function [str] = getFooter(obj)
str = sprintf('n');
end
end
end
Может быть лучшим решением, позволяющим избежать отображения некоторых свойств (в том числе из справки-ссылки):
classdef foo < matlab.mixin.CustomDisplay
properties (SetAccess = private, GetAccess = private) % here remove any public access, use '(Hidden)' if only want to remove from display and help
Login = 'root';
Password = '1234'
end
end
ПРИМЕЧАНИЕ: Осторожно, как писал @Daniel, что бы вы ни делали, struct(a)
отображаются все имена свойств и значения.
Ответ №2:
Помимо метода от @CitizenInsane, вы можете получить то, что хотите, просто добавив Hidden = true
атрибут к некоторым или всем вашим свойствам.
Повторяя то, что говорили другие, однако, если вы делаете это для того, чтобы серьезно помешать людям понять внутренности вашего класса, struct(a)
всегда будете показывать им свойства. Вы можете перегрузить свой класс struct
методом, который выдает ошибку, но тогда builtin('struct', a)
все равно будет выполнять исходную работу. Также ?Classname
предоставит метаинформацию о классе, которая включает его свойства.
Комментарии:
1. есть ли способ полностью предотвратить это?
2. Нет. Однако вы могли бы запутать имена свойств, например, назвать их Hidden1, Hidden2 и т.д.