2011-09-11 28 views
6

Dada una estructura, ¿hay alguna manera de crear una clase en MATLAB? Tomemos, por ejemploCrear clases dinámicamente en matlab

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

p = 

    x: 0 
    y: 0 

>> name = 'Point' 

name = 

Point 

Lo que me gustaría hacer, se da una cadena que contiene el nombre de la clase y una estructura con que contiene los campos me gustaría crear una clase sin tener que escribir un archivo escrito de forma explícita la definición.

Ahora si usamos class(p) obtendremos struct. Lo que quiero hacer es crear un objeto del tipo Point para que cuando lo haga class(obj) entonces obtenga Point.

¿Alguna idea de cómo lograr esto además de escribir un archivo en MATLAB con la definición de clase y luego ejecutarlo?

+0

¿Para qué se necesitan clases creadas dinámicamente? – Jonas

+0

@Jonas, tengo un archivo binario con información sobre las estructuras y su información. La información incluye el nombre de la clase, los campos que contiene y el tipo de datos de los campos. Puedo leer esta información y almacenarla en una estructura simple en MATLAB, pero no sabré el tipo de objeto que es la estructura. Quiero ser capaz de construir estos objetos sobre la marcha con las instrucciones del archivo binario. – jmlopez

+0

¿Qué ocurre con el almacenamiento de datos en una matriz de estructuras con los campos 'Nombre' y' Datos' donde los datos son una estructura con, como su nombre indica, datos. – Mikhail

Respuesta

4

O tienes una funcionalidad específica (métodos) asociados a la clase Point en comparación con, por ejemplo, la clase Line, en cuyo caso debe escribir las clases a mano, de todos modos, o puede crear una sola clase dynamicprops que puede tener propiedades creadas dinámicamente, y a menos que necesite llamar a un método llamado class, simplificará mucho su vida llamando al classname en su lugar.

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

Me gusta algo así. Si llamo a 'clase' un objeto' myDynamicClass' obtendré 'myDynamicClass'.Puedo usar esto para verificar el nombre de clase real usando la función definida allí. Esto se comportará mejor que solo una estructura porque verificará si tiene los campos correctos. Gracias Jonas, ahora no tendré que escribir un archivo diferente para cada clase especificada en el archivo binario. – jmlopez

+0

@jmlopez: De nada. Tenga en cuenta que también puede crear establecer y obtener métodos para las propiedades dinámicas, para que pueda agregar funciones adicionales, por ejemplo, comprobación de errores. – Jonas

+0

en el '11 Debería haber dicho: "¿En serio? ¿Cómo puedo crear el conjunto y obtener métodos para mis propiedades dinámicas?", Después de tener una lucha pensando en cómo hacerlo, se me ocurrió [esto] (http: //stackoverflow.com/a/20810965/788553). ¿Es esa la forma correcta de crear los métodos establecidos? – jmlopez

1

No conozco ninguna forma de crear objetos dinámicamente, por lo que diría que la respuesta a su pregunta es no. Sin embargo, para resolver su problema, yo propondría algo muy similar a lo que dijo Mikhail:

Trabaja con una estructura con campos x, y y classname:

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

y luego escribir una función myclass(x) que devuelve x.classname . Si por alguna razón es necesario utilizar class() incluso se podría sobrecargar con su propia función que comprueba si x es una de sus estructuras especiales y pide builtin('class', x) lo contrario:

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 solución que he utilizado en el pasado es escribir una función de MATLAB que toma esta información (es decir, el nombre de la clase y los campos) y escribe un archivo-M que contiene la necesaria classdef construir.

Esto funciona bien si está utilizando esta información para describir un prototipo que desea expandir más adelante.