В MATLAB метод класса может действовать как обратный вызов uicontrol, не будучи публичным? - PullRequest
7 голосов
/ 20 сентября 2008

В MATLAB 2008a, есть ли способ позволить методу класса выступать в качестве функции обратного вызова uicontrol, не делая метод общедоступным? Концептуально, метод не должен быть публичным, потому что он никогда не должен вызываться пользователем класса. Он должен вызываться только в результате события пользовательского интерфейса, инициирующего обратный вызов. Однако, если я устанавливаю доступ метода к приватному или защищенному, обратный вызов не работает. Мой класс является производным от hgsetget и определяется с использованием синтаксиса 2008a classdef.

Код uicontrol выглядит примерно так:


methods (Access = public)
   function this = MyClass(args)
      this.someClassProperty = uicontrol(property1, value1, ... , 'Callback', ...
      {@(src, event)myCallbackMethod(this, src, event)});
      % the rest of the class constructor code
   end
end

Код обратного вызова выглядит так:


methods (Access = private)  % This doesn't work because it's private
   % It works just fine if I make it public instead, but that's wrong conceptually.
   function myCallbackMethod(this, src, event)
      % do something
   end
end

1 Ответ

8 голосов
/ 22 сентября 2008

Сохранение дескриптора функции обратного вызова в качестве частного свойства, кажется, обходит проблему. Попробуйте это:

classdef MyClass
    properties
        handle;
    end

    properties (Access=private)
        callback;
    end

    methods
        function this = MyClass(args)
            this.callback = @myCallbackMethod;
            this.handle = uicontrol('Callback', ...
                {@(src, event)myCallbackMethod(this, src, event)});
        end
    end

    methods (Access = private)
        function myCallbackMethod(this, src, event)
            disp('Hello world!');
        end
    end
end
...