2012-01-18 10 views
5

Ho una classe Foo e una funzione che ottiene Foo come parametro di input. In questa funzione ho anche fare un po 'il controllo degli errori usando isa:Come posso passare un riferimento null in MATLAB in modo che isa restituisca true?

function (x) 
    if ~isa(x,'Foo') 
    error('Wrong!'); 
    end 

voglio passare qualcosa che è come nulla in Java. Tuttavia quando lo passo [] ottengo un errore. Puoi dirmi cosa posso fare? Ho pensato di passare sempre un array di celle o di cercare empty ogni volta che uso isa.

risposta

9

Prima di tutto, è possibile verificare la nostra condizione con

validParam = isa(x,'Foo') || isempty(x); 

Tuttavia, il modo migliore sarà quello di creare una classe vuota utilizzando il metodo statico empty:

e = Foo.empty(0); 
    isa(x,'Foo') 

E il risultato è :

isa (Foo.empty (0), 'Foo')

ans =

1 

Tra l'altro, questo è utile anche per un altro caso - Si supponga di voler crescere in modo dinamico e array di oggetti Foo. Potresti usare un array di celle, ma poi perdi il tipo di sicurezza. Invece, crea Foo.empty().

Tuttavia, vi è un cavalletto nell'utilizzo di questo metodo. Non è abbastanza intelligente da gestire l'ereditarietà -

Lasciare Bar essere una classe che eredita da Foo.

classdef Bar < Foo 

end 

E si alloca un nuovo array di oggetti Foo:

x = Foo.empty(0) 

x =

0x0 vuoto Foo senza proprietà.
Metodi

Quindi provare a aggiungere Bar:

x(end+1) = Bar() 

??? Si è verificato il seguente errore durante la conversione da Bar a Foo: Errore durante l'utilizzo di ==> Foo Troppi argomenti di input.

Quindi l'unico rimedio per questo caso è l'utilizzo di matrice di celle.


Edit (1): Sembra che Matlab hanno aggiunto un special class al fine di gestire l'eredità:

Descrizione

matlab.mixin.Heterogeneous è una classe astratta che fornisce supporto per la formazione di matrici eterogenee. Una matrice eterogenea è una matrice di oggetti che differiscono nella loro classe specifica, ma sono tutti derivati ​​da o sono esempi di una classe radice. La classe radice deriva direttamente da matlab.mixin.Heterogeneous.

Problemi correlati