MATLAB Answers

Creating a class object with the same class name as a variable

57 views (last 30 days)
Wenjie Han
Wenjie Han on 20 Jun 2018
Answered: per isakson on 20 Jun 2018
Suppose I have 10 classes defined well, with class names as a1,a2,a3...a10. A key variable K indicates which class object I should create.
For example, when K='a1',obj=a1();
when K='a2',obj=a2();
.....
I don't want to use switch or other similar control commands, since the class library is always expanding, more classes definitions will be added. I aim to find a good way to create corresponding class object with the least change, like obj=K(),where K=a1,a2,a3....but absolutely this doesn't work.
Is there any way to solve this problem? Thanks a lot!

  3 Comments

Adam
Adam on 20 Jun 2018
How is 'K' created?
Ideally it should contain a function handle to the constructor of the class you want to create an object of rather than a string.
I am assuming that your classes are not really named a1, a2, a3, etc and that is just for the purposes of the question, otherwise you really need to find some meaningful names for your classes!
Guillaume
Guillaume on 20 Jun 2018
More details about the purpose of these classes would greatly help in giving you the right answer. Depending on this the answer could be: Don't do this your design is flawed, use a class factory function, use inheritance from an abstract base class, something else or a combination of these.

Sign in to comment.

Answers (2)

Sayyed Ahmad
Sayyed Ahmad on 20 Jun 2018
I creat some file which is called: CLASS_Template.m and used some KEY_CLASSNAME as a key in this template.
%codes of CLASS_Template:
classdef test
properties (SetAccess='public', GetAccess='public')
prop;
end
properties (SetAccess='private', GetAccess='public')
end
properties(SetAccess='private', GetAccess='private')
end
methods
function o=test(varargin)
switch nargin
case 1
o.prop = varargin{1};
otherwise
error('the number of input proprties doesn''t macht.')
end
end
function display(o)
disp('<a href="matlab: helpwin test">test properties:</a>')
disp(o.prop);
end
function disp(o)
display(o)
end
function help(o)
helpwin test
end
end
end
in the second file called CreateClass would the Key replaced with the className.
function CreateClass(varargin)
classname = varargin{1};
dirname = ['@' classname];
str_date=datestr(date,'dd.mmm.yyyy');
[status,message,messageid]=mkdir(dirname);
pause(1);
fid = fopen('/Path_to_Template/CLASS_Template.m');
F = fread(fid, '*char')';
fclose(fid);
F=strrep(F, 'KEY_CLASSNAME', classname);
F=strrep(F, 'KEY_DATE', str_date);
cd([pwd '\' dirname]);
fid = fopen([classname '.m'], 'w');
fwrite(fid, F);
fclose(fid);
open([classname '.m'])
end
Now you can run the following command
>>CreateClass test
Depending on your needs you could have more than one key.
I hope you have your answer.
cheers! Ahmad

  0 Comments

Sign in to comment.


per isakson
per isakson on 20 Jun 2018
You could create a function, factory, to communicate the intent.
K = 'a1';
obj = factory( K );
where
function obj = factory( name )
obj = feval( name );
end

  0 Comments

Sign in to comment.


Translated by