2012-04-20 19 views

risposta

25

Ogni classe ha un costruttore. Tuttavia ... il costruttore può accettare qualsiasi numero e tipo di argomenti, compresi quelli basati su varargin.

Così, per fornire la possibilità di un terzo argomento di default in Java si potrebbe scrivere qualcosa di simile (esempi basati su 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; 
} 

in Matlab si potrebbe scrivere

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

Si noti che non è possibile creare "sé" all'interno di un'istruzione if, quindi la prima volta che si assegna qualcosa a "self" deve venire prima o dopo la clausola if. – Jonas

+0

ha finito con questa soluzione :) tnx! – bsmca

4

Ogni classe ha un solo costruttore, e ciascuno .m-file può contenere solo una definizione di classe.

Se si desidera avere una classe con piccole differenze a seconda dell'input, è possibile utilizzare proprietà che definiscono gli switch riconosciuti dai metodi della classe. Se si desidera avere classi molto diverse a seconda dell'input, è possibile creare una funzione generateClass che chiamerà l'una o l'altra classe definita in file diversi. Naturalmente, se queste diverse classi hanno molti metodi e proprietà comuni, è possibile creare entrambe come sottoclassi in una superclasse comune.

+0

Buon post ... ma nota al poster originale: sii veramente VERAMENTE attento all'eredità, ti dà un sacco di corda con cui impiccarti. Non ricorrere a questo se vuoi avere un costruttore predefinito e altri costruttori che possono inizializzare le variabili.Utilizzare varargin per ottenere questa funzionalità. – learnvst

+0

Stessa classe, solo il processo di inizializzazione è diverso.Penso che passerò tutti i parametri necessari per costruire un'istanza in questi due modi e un mo re parametro che definirà il modo di costruire. Sporco ma veloce .. triste, la mia soluzione stava diventando così comprensibile .. peccato per te MATLAB! – bsmca

+0

@bsmca: è sempre possibile definire i metodi (statici) che implementano i due diversi modi di creare, quindi si chiama uno di essi dal costruttore comune. Assicurati solo di creare l'oggetto prima o dopo, ma non all'interno di questi metodi. – Jonas

2

Il La risposta di Pursuit funziona, ma un utente che non ha familiarità con la funzione non può vedere quanti argomenti sono necessari o cosa servono. Vorrei raccomandare questo:..

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

Se ora si digita "Bicicletta (" e aspettare è possibile vedere almeno i tre argomenti La seconda possibilità non viene visualizzato anche se sembra possibile (ad esempio per la trama) ma io don Non so come fare.

+0

Funziona davvero per te? Ottengo un "errore di argomenti di input non sufficiente" (MATLAB: minrhs) se non fornisco tutti gli argomenti (su 2014a eb). Questo sembra funzionare su funzioni "libere", ma non su costruttori/membri di classe. –

Problemi correlati