2012-03-20 24 views
7

Let tenemos una clase abstracta:El uso de clases abstractas en Matlab (sin propiedades)

classdef ACalculation < handle 

    methods (Abstract) 
     [result] = calculate (this, data); 

     plot (this, data, limX, limY); 
    end 

end 

Y algunas otras clases que implementan ACalculation

classdef Maximum < ACalculation 

    methods 
     function [result] = calculate (this, data) 
      %... 
     end 

     function plot (this, data, limX, limY) 
      %... 
     end 
end 

Para funciones de clase de implementación i dar toda la información necesaria , entonces no necesito ninguna propiedad Parece que necesito clases estáticas. Pero si tengo clases estáticas, tengo un problema para llamar a estas funciones. me gustaría hacer algo así:

criteria = Maximum(); 
%...... 
result = criteria.calculate(data); 

¿Es mala manera de utilizar la herencia? ¿Debo ignorar los consejos de matlab para cambiar las funciones a estática? ¿Qué más podría hacer aquí?

Respuesta

5

Creo que en este caso, la implementación de la interfaz estática es un buen patrón. Definir las clases de la siguiente manera:

classdef ACalculation < handle 

    methods (Abstract,Public,Static) 
     [result] = calculate (data);  
     plot (data, limX, limY); 
    end 

end 

classdef Maximum < ACalculation 

    methods (Public,Static) 
     function [result] = calculate (data) 
      %... 
     end 

     function plot (data, limX, limY) 
      %... 
     end 
end 

Entonces, se puede escribir una función que espera un tipo ACalculation:

function foo(acalc,data) 
     assert(isa(acalc,'ACalculation')); 
     acalc.calculate(data); 
     acalc.plot(data,[100 200]); 
end 

A continuación, cree una instancia de Maximum vacía y pasarlo a foo:

foo (Maximum.empty(0), [1 2 3]); 

Si desea cambiar el método de cálculo, llame al

foo (Minimum.empty(0), [1 2 3]); 

Cuando dices que un patrón así no funcionará, estás pensando en Java/C#/C++ developer. Pero a diferencia de C++ donde static y virtual palabra clave no pueden coexistir, Matlab no tiene tal limitación, porque todo se hace en tiempo de ejecución, y una "instancia" puede estar vacía o una matriz de elementos n.

+0

¡Funciona, gracias! – Lex

0

Si calculate es un método estático de Maximum‘, you would use ‘result = Maximum.calculate(data) para llamarlo, sin crear instancias de criteria.

No es (necesariamente) una mala forma de usar herencia, o un mal consejo de MATLAB.

+0

Pero si también tengo otras clases (Mínimo, Medio, etc.) me gustaría elegir en algún lugar al principio qué tipo de letra se usa y después usar algún objeto de clase abstracta, sin decir exactamente qué clase es. En este caso, no puedo usar estática, ¿verdad? – Lex

Cuestiones relacionadas