2008-09-19 25 views
7

Dans MATLAB 2008a, existe-t-il un moyen de permettre à une méthode de classe d'agir comme une fonction de rappel uicontrol sans avoir à rendre la méthode publique? Conceptuellement, la méthode ne devrait pas être publique car elle ne devrait jamais être appelée par un utilisateur de la classe. Il ne doit être appelé qu'à la suite d'un événement d'interface utilisateur déclenchant un rappel. Toutefois, si je définis l'accès de la méthode à private ou protected, le rappel ne fonctionne pas. Ma classe est dérivée de hgsetget et est définie en utilisant la syntaxe classdef 2008a.Dans MATLAB, une méthode de classe peut-elle agir comme un rappel uicontrol sans être publique?

Le code uicontrol ressemble à:


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 

Le code de rappel ressemble:


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 

Répondre

8

Stockage de la poignée de fonction de la fonction de rappel comme une propriété privée semble contourner le problème. Essayez ceci:

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