2012-04-20 11 views

Respuesta

25

Cada clase tiene un constructor. Sin embargo ... el constructor puede aceptar cualquier número y tipo de argumentos, incluidos los basados ​​en varargin.

Por lo tanto, para proporcionar la opción de un tercer argumento por defecto en Java podría escribir algo como esto (ejemplos basados ​​en java documentation):

public Bicycle(int startCadence, int startSpeed, int startGear) { 
    gear = startGear; 
    cadence = startCadence; 
    speed = startSpeed; 
} 
public Bicycle(int startCadence, int startSpeed) { 
    gear = 1; 
    cadence = startCadence; 
    speed = startSpeed; 
} 

En Matlab se podría escribir

methods (Access = public) 
    function self = Bicycle(varargin) 
     if nargin>2 
      gear = varargin{3}; 
     else 
      gear = 1; 
     end 
     cadence = varargin{1}; 
     speed = varargin{2};   
    end 
end 
+2

Tenga en cuenta que no puede crear "self" dentro de una sentencia if, por lo que la primera vez que asigne algo a "self" tiene que aparecer antes o después de if-clause. – Jonas

+0

terminó con esta solución :) tnx! – bsmca

4

Cada clase tiene un solo constructor, y cada .m-archivo sólo puede contener una definición de clase.

Si desea tener una clase con pequeñas diferencias dependiendo de la entrada, puede usar propiedades que definan conmutadores reconocidos por los métodos de clase. Si desea tener clases muy diferentes dependiendo de la entrada, puede crear una función generateClass que llamará a una u otra clase definida en archivos diferentes. Por supuesto, si estas clases diferentes tienen muchos métodos y propiedades comunes, puede crear ambas como subclases a una superclase común.

+0

Buena publicación ... pero tenga en cuenta el cartel original: Sea realmente MUY cuidadoso con la herencia. Le da mucha cuerda para colgarse. No recurra a ella si solo quiere tener un constructor predeterminado y otros constructores que puedan inicializar variables. Use varargin para obtener esta funcionalidad. – learnvst

+0

La misma clase, solo el proceso de inicialización es diferente. Creo que pasaré todos los parámetros necesarios para construir una instancia de estas dos maneras y un mes re parámetro que definirá la forma de construir. Sucio pero rápido ... triste, mi solución era cada vez más comprensible ... ¡Qué vergüenza, matlab! – bsmca

+0

@bsmca: siempre puede definir métodos (estáticos) que implementan las dos formas diferentes de compilación, y luego llama a cualquiera de ellos desde el constructor común. Solo asegúrese de crear el objeto solo antes o después, pero no dentro de estos métodos. – Jonas

2

El La respuesta de Pursuit funciona, pero un usuario que no está familiarizado con la función no puede ver cuántos argumentos se necesitan o para qué sirven. Yo recomendaría este:..

methods (Access = public) 
    function self = Bicycle(startCadence, startSpeed, startGear) 
     if nargin>2 
      gear = startGear; 
     else 
      gear = 1; 
     end 
     cadence = startCadence; 
     speed = startSpeed;   
    end 
end 

Si ahora escribe "bicicletas (" y esperar a que se puede ver al menos los tres argumentos La segunda posibilidad no se muestra aunque parece posible (por ejemplo de parcela) pero Don "No sé cómo hacer esto."

+0

¿Eso realmente funciona para usted? Obtengo "no suficientes argumentos de entrada errror" (MATLAB: minrhs) si no proporciono todos los argumentos (en 2014a yb). Esto parece funcionar en funciones "gratuitas", pero no en constructores/miembros de la clase. –

Cuestiones relacionadas