2011-07-08 12 views
12

Sto lavorando ad un'applicazione a riga di comando per la simulazione ad ultrasuoni in MATLAB. Quasi ogni oggetto nel nostro codice è una sottoclasse di handle (da passare come riferimenti). Il problema che sto avendo è che tutti i metodi ereditati dalla classe handle vengono mostrati nella sezione "Metodi" in MATLAB (vedi esempio sotto).È possibile nascondere i metodi ereditati dalla classe handle in matlab?

Quello che voglio è nascondere i metodi ereditati dalla classe handle in modo che solo la funzione che l'utente è autorizzato a utilizzare sia mostrata sotto "Metodi". In questo modo non sembra così disordinato per l'utente se lui/lei vuole sapere quali metodi usare.

Esempio class Test:

classdef Test < handle 
    methods 
     function myFunction(obj) 
     end 
    end 
end 

Nella riga di comando:

T = Test() 

T = 

    Test handle with no properties. 
    Methods, Events, Superclasses 

Dopo aver cliccato su "Metodi":

Methods for class Test: 

Test   delete  findobj  ge   isvalid  lt   ne   
addlistener eq   findprop  gt   le   myFunction notify 

quello che voglio:

Methods for class Test: 

Test   myFunction 

E 'possibile in MATLAB?

risposta

9

C'è una soluzione here, incluso il codice di esempio.

In breve, ciò che devi fare è di sovraccaricare la funzione built-in di Matlab methods, in modo che quando viene chiamato tua classe, rimuove i metodi di handle dall'uscita. Assicurati che funzioni su qualsiasi altra cosa, in modo da non rovinare l'altro codice dell'utente. Se non si utilizza la variante @foldername per memorizzare la classe, è possibile inserirla in una directory private, ad esempio.

+0

+1 bella scoperta ... – Amro

+0

Il link sembra rotto. (Penso che la politica standard sia - o si sia spostata su - riassumendo informazioni da link esterni.) – sage

+0

@sage: Bummer che il link è rotto. Fortunatamente, il secondo paragrafo fornisce il riassunto. – Jonas

2

Non è una soluzione completa, ma se lo si fa methods(T, '-full'), allora almeno ti dice quali metodi sono ereditati dall'handle, quindi sai cosa ignorare.

+0

Grazie per la risposta. Questa è una buona cosa da sapere, ma non proprio quello che stavo cercando. Forse avrei dovuto spiegarlo meglio nel PO. Il motivo principale per cui posso farlo è che gli utenti possono utilizzare il completamento automatico sulle classi senza ottenere tutte le cose "inutili" dall'handle. – bakstad

14

Se si sovraccaricano tutti i metodi della sottoclasse in un blocco di metodi nascosti, penso che farà esattamente ciò che si sta cercando.

Non sono sicuro di quali versioni di Matlab funzioni, ma sicuramente funziona per me in R2012b.

L'eccezione è isvalid poiché è sigillata in modo che non sia possibile sostituirla in una sottoclasse di handle.

classdef handle_light < handle 
    methods(Hidden) 
     function lh = addlistener(varargin) 
     lh = [email protected](varargin{:}); 
     end 
     function notify(varargin) 
     [email protected](varargin{:}); 
     end 
     function delete(varargin) 
     [email protected](varargin{:}); 
     end 
     function Hmatch = findobj(varargin) 
     Hmatch = [email protected](varargin{:}); 
     end 
     function p = findprop(varargin) 
     p = [email protected](varargin{:}); 
     end 
     function TF = eq(varargin) 
     TF = [email protected](varargin{:}); 
     end 
     function TF = ne(varargin) 
     TF = [email protected](varargin{:}); 
     end 
     function TF = lt(varargin) 
     TF = [email protected](varargin{:}); 
     end 
     function TF = le(varargin) 
     TF = [email protected](varargin{:}); 
     end 
     function TF = gt(varargin) 
     TF = [email protected](varargin{:}); 
     end 
     function TF = ge(varargin) 
     TF = [email protected](varargin{:}); 
     end 
     function TF = isvalid(varargin) 
     TF = [email protected](varargin{:}); 
     end 
    end 
end 

Se si salva la classe sopra per handle_light.m e quindi digitare methods handle_light nella finestra di comando si otterrà il seguente risultato:

Methods for class handle_light: 

handle_light isvalid 

La classe test diventa quindi:

classdef Test < handle_light 
    methods 
     function myFunction(obj) 
     end 
    end 
end 

Facendolo in questo modo significa che non è necessario inserire i sovraccarichi nella classe Test che mantiene le cose in ordine.

+0

Perfezionare! Ho incorporato questo (con modifiche banali) nel mio [matlab-utilities] (https://github.com/ransage/matlab-utilities/blob/master/ThirdPartyTools/handle_light.m), che potrebbe essere un formato migliore per la copia/incolla dato che ha l'attribuzione ... – sage

+0

@sage è grandioso! Sono contento che qualcun altro lo trovi utile. – sclarke81

+1

Questa risposta mi ha aiutato molto, grazie. Una cosa però 'isvalid' l'ha resa nella lista dei metodi di handle - quindi potresti voler aggiornare la tua risposta. –

0

Basta ottenere le funzioni dalla classe ereditata e annullarle con quelle della classe principale utilizzando setdiff.

mH = methods('handle'); 
m = methods('MyClass'); 

m = setdiff(m,mH); 
Problemi correlati