Создание классов динамически в Matlab - PullRequest
6 голосов
/ 11 сентября 2011

Учитывая структуру, есть ли способ создать класс в 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 ]

4 голосов
/ 12 сентября 2011

Либо у вас есть определенные функциональные возможности (методы), связанные с классом 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 голос
/ 12 сентября 2011

Одним из решений, которое я использовал в прошлом, является написание функции MATLAB, которая берет эту информацию (то есть имя класса и поля) и записывает M-файл, содержащий требуемую конструкцию classdef.

Thisхорошо работает, если вы используете эту информацию для описания прототипа, который вы хотите расширить позже.

1 голос
/ 12 сентября 2011

Я не знаю ни одного способа динамического создания объектов, поэтому я бы сказал, что ответ на ваш вопрос: нет . Однако, чтобы решить вашу проблему, я бы предложил нечто очень похожее на то, что сказал Михаил:

Работа со структурой с полями 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...