2011-09-11 9 views
6

Data una struttura, esiste un modo per creare una classe in MATLAB? Prendete per esempioCreazione di classi dinamicamente in matlab

>> p = struct(); p.x = 0; p.y = 0; 
>> p 

p = 

    x: 0 
    y: 0 

>> name = 'Point' 

name = 

Point 

Quello che vorrei fare, è data una stringa contenente il nome della classe e una struttura con contenente i campi vorrei creare una classe senza dover scrivere un file scrivendo esplicitamente la definizione.

In questo momento se usiamo class(p) otterremo struct. Quello che voglio fare è creare un oggetto del tipo Point in modo che quando faccio class(obj) ottengo Point.

Qualche idea su come realizzare questo oltre a scrivere un file in MATLAB con la definizione della classe e quindi eseguirlo?

+0

Per cosa sono necessarie le classi create dinamicamente? – Jonas

+0

@ Jonas, ho un file binario con informazioni sulle strutture e le sue informazioni. Le informazioni includono il nome della classe, i campi che contiene e il tipo di dati dei campi. Posso leggere queste informazioni e memorizzarle in una semplice struttura in MATLAB, ma non conoscerò il tipo di oggetto che è la struct. Voglio essere in grado di costruire questi oggetti al volo con le istruzioni del file binario. – jmlopez

+0

E riguardo la memorizzazione dei dati in una struct-array con campi 'Name' e' Data' dove data è una struct con, come dice il nome, data. – Mikhail

risposta

4

O hai funzionalità specifiche (metodi) associati la classe Point in contrapposizione ad es la classe Line, nel qual caso si dovrebbe scrivere le classi a mano, in ogni caso, o si può fare un singolo dynamicprops classe che può aver creato in modo dinamico proprietà, e se non si ha realmente bisogno di chiamare un metodo di nome class, a semplificare molto la vita chiamando invece classname.

classdef myDynamicClass < dynamicprops 
properties (Hidden) 
myClass %# this stores the class name 
end 
methods 
function obj = myDynamicClass(myClassName,varargin) 
%# synopsis: obj = myDynamicClass(myClassName,propertyName,propertyValue,...) 
%# myClassName is the name of the class that is returned by 'classname(obj)' 
%# propertyName/propertyValue define the dynamic properties 

obj.myClass = myClassName; 

for i=1:2:length(varargin) 
addprop(obj,varargin{i}) 
obj.(varargin{i}) = varargin{i+1}; 
end 
end 

function out = classname(obj) 
out = obj.myClass; 
end 

end 
end 
+0

Mi piace un po '. Se chiamo 'class' un oggetto' myDynamicClass' otterrò 'myDynamicClass'.Posso usare questo per controllare il vero nome di classe usando la funzione definita lì. Questo si comporta meglio di una semplice struct perché controllerà se ha i campi giusti. Grazie Jonas, ora non dovrò scrivere un file diverso per ogni classe specificata nel file binario. – jmlopez

+0

@jmlopez: Prego. Tieni presente che puoi anche creare set e ottenere metodi per le proprietà dinamiche, in modo che tu possa aggiungere funzionalità aggiuntive per es. controllo degli errori. – Jonas

+0

indietro in '11 Avrei dovuto dire, "Oh davvero? Come posso creare il set e ottenere metodi per le mie proprietà dinamiche?", Dopo aver avuto una lotta su come fare questo mi è venuta in mente [questo] (http: //stackoverflow.com/a/20810965/788553). È questo il modo corretto di creare i metodi dell'insieme? – jmlopez

1

Non conosco alcun modo di creare oggetti dinamicamente, quindi direi che la risposta alla tua domanda è no. Tuttavia, per risolvere il problema, vorrei proporre qualcosa di molto simile a quello che ha detto Mikhail:

Lavora con una struttura con campi x, y e classname:

p.x=0; 
p.y=0; 
p.classname='Point'; 

e quindi scrivere una funzione myclass(x) che restituisce x.classname . Se per qualche motivo è necessario utilizzare class() si potrebbe anche sovraccaricarlo con la propria funzione che controlla se x è uno dei vostri struct speciali e le chiamate builtin('class', x) altrimenti:

function out=class(varargin) 
if nargin==1 && isstruct(varargin{1}) ... #check if we were given a struct 
    && isfield(varargin{1}, 'classname') ... #...which contains a field classname 
    && ischar(varargin{1}.classname) %# ... which is a string 
    out=varargin{1}.classname; %# ok, our special case :-) 
else 
    out=builtin('class',varargin{:}); %# normal case - call builtin class() 
end 
1

Una soluzione che ho usato in passato è quello di scrivere una funzione MATLAB che prende queste informazioni (vale a dire il nome della classe e campi) e scrive un M-file contenente la richiesta classdef costruire.

Questo funziona bene se si utilizzano queste informazioni per descrivere un prototipo che si desidera espandere in seguito.

Problemi correlati