In MATLAB, un metodo di classe può fungere da callback di uicontrol senza essere pubblico?
-
01-07-2019 - |
Domanda
In MATLAB 2008a, c'è un modo per consentire a un metodo di classe di agire come una funzione di callback di uicontrol senza dover rendere pubblico il metodo? Concettualmente, il metodo non dovrebbe essere pubblico perché non dovrebbe mai essere chiamato da un utente della classe. Dovrebbe essere chiamato solo come risultato di un evento UI che attiva un callback. Tuttavia, se imposto l'accesso del metodo su privato o protetto, il callback non funziona. La mia classe deriva da hgsetget ed è definita usando la sintassi classaf 2008a.
Il codice uicontrol è simile a:
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
Il codice di richiamata è simile a:
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
Soluzione
La memorizzazione dell'handle di funzione del callback come proprietà privata sembra risolvere il problema. Prova questo:
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