给定一个结构,有没有办法在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中使用类定义编写文件然后执行它之外,还有任何想法如何实现这一目标?
答案 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)
我不知道有任何动态创建对象的方法,所以我要说你的问题的答案是没有。但是,为了解决你的问题,我会提出一些与米哈伊尔所说的非常相似的东西:
使用包含字段x
,y
和classname
的结构:
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文件。
如果您使用此信息来描述稍后要扩展的原型,则此方法很有效。