在matlab中动态创建类

时间:2011-09-11 06:16:07

标签: oop matlab

给定一个结构,有没有办法在MATLAB中创建一个类?举个例子

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

p = 

    x: 0
    y: 0

>> name = 'Point'

name =

Point

我想做的是,给出一个包含类名称的字符串和一个包含我想创建类的字段的结构,而不必编写明确写入定义的文件。

现在,如果我们使用class(p),我们将获得struct。我想要做的是创建一个Point类型的对象,这样当我class(obj)时,我得到Point

除了在MATLAB中使用类定义编写文件然后执行它之外,还有任何想法如何实现这一目标?

3 个答案:

答案 0 :(得分:4)

要么具有与Point类关联的特定功能(方法),而不是Line类,在这种情况下,您应该手动编写类,或者您可以创建一个可以具有动态创建属性的dynamicprops类,除非您确实需要调用方法名为class,您可以通过调用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

答案 1 :(得分:1)

我不知道有任何动态创建对象的方法,所以我要说你的问题的答案是没有。但是,为了解决你的问题,我会提出一些与米哈伊尔所说的非常相似的东西:

使用包含字段xyclassname的结构:

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

然后编写一个返回myclass(x)的函数x.classname。如果由于某种原因你需要使用class(),你甚至可以用自己的函数重载它,检查x是否是你的特殊结构之一,否则调用builtin('class', x)

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

答案 2 :(得分:1)

我过去使用的一个解决方案是编写一个MATLAB函数来获取这些信息(即类名和字段)并写入包含所需classdef结构的M文件。

如果您使用此信息来描述稍后要扩展的原型,则此方法很有效。