2011-06-14 10 views
5

Tengo una clase que hereda de múltiples superclases, y me gustaría obtener los métodos que tiene la clase. Naively utilizando methods() devuelve métodos de la clase con la que estoy trabajando, así como métodos de superclase, pero no estoy interesado en los métodos de superclase.MATLAB - enumere todos los métodos suministrados por la subclase solamente?

¿Alguna idea de cómo hacer esto? No pude encontrar nada en la documentación de MATLAB.

Gracias!

+0

¿Está utilizando nuevas clases MCOS de estilo (con archivos classdef), o clases de estilo antiguo? –

+0

archivos classdef. –

Respuesta

3

Si su subclase no vuelve a implementar ninguno de los métodos de las superclases (o si está bien ignorando los métodos reimplementados), puede usar las funciones METHODS y SUPERCLASSES para encontrar una lista de métodos de subclase que no son también métodos de cualquiera de las superclases. Por ejemplo:

>> obj = 'hgsetget'; %# A sample class name 
>> supClasses = superclasses(obj) 

supClasses = 

    'handle' %# Just one superclass, but what follows should handle more 

>> supMethods = cellfun(@methods,supClasses,... %# Find methods of superclasses 
         'UniformOutput',false); 
>> supMethods = unique(vertcat(supMethods{:})); %# Get a unique list of 
               %# superclass methods 
>> subMethods = setdiff(methods(obj),supMethods) %# Find methods unique to the 
                %# subclass 
subMethods = 

    'get' 
    'getdisp' 
    'set' 
    'setdisp' 
+0

Tenía la esperanza de que hubiera una elegante función incorporada para hacer esto, pero de alguna manera pensé que este tipo de solución es a lo que se reduciría. ¡Gracias un montón! –

2

A pesar de que esta cuestión se resuelve, permítanme añadir otra respuesta usando meta.class capacidades:

%# some class name 
clname = 'hgsetget'; 

%# obtain class meta-info 
mt = meta.class.fromName(clname); 

%# get name of class defining each method 
cdef = arrayfun(@(c)c.Name, [mt.MethodList.DefiningClass], 'Uniform',false); 

%# keep only methods that are defined in the subclass 
subMethods = {mt.MethodList(ismember(cdef,clname)).Name} 

El resultado de este ejemplo:

subMethods = 
    'set' 'get' 'setdisp' 'getdisp' 'empty' 

Nota cómo el resultado también incluye los métodos estáticos empty que todas las clases no abstractas tienen (se usan para crear una matriz vacía de esa clase).

+0

También puede obtener la metaclase utilizando el operador de clase '?', Como en "mt =? Hgsetget". – Edric

Cuestiones relacionadas