скрыть информацию об объекте в matlab

#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 и т.д.