J'essaie de rendre MATLAB un peu plus utilisable que ce qu'il est (pour moi), et l'une des choses que j'ai toujours voulu corriger est un meilleur constructeur de classe. Je veux avoir l'interface suivante:Constructeur de classe Quick-and-dirty pour MATLAB?
MyClass.new(some_args).method1;
# instead of classical:
obj = MyClass(some_args);
obj.method1;
je peux facilement y parvenir en définissant une méthode statique new
:
classdef MyClass
methods
function obj = MyClass(varargin); end
function method1(obj,varargin); end
end
methods (Static)
function obj = new(varargin); obj = MyClass(varargin{:}); end
end
end
Mais cela nécessite l'ajout d'un tel procédé à toutes les classes, et il est donc pas très élégant/pratique. Je pensais que je pouvais faire le tour en définissant une classe commune avec le constructeur suivant
classdef CommonClass
methods (Static)
function obj = new(varargin)
# getting name of the current file (Object), i.e. basename(__FILE__)
try clear E; E; catch E, [s, s] = fileparts(E.stack(1).file); end;
# creating object with name $s
obj = eval([s '(varargin{:})']);
end
end
end
classdef MyClass < CommonClass
end
Cependant, cela ne fonctionne pas parce que les appels Matlab new()
de Object.m
, et donc j'obtenir instance de Object
au lieu de MyClass
.
Des idées comment je peux l'améliorer?
EDIT1:
Je voudrais que cela fonctionne aussi pour les classes créées à l'intérieur d'autres ceux:
classdef MyAnotherClass < CommonClass
methods
function obj = MyAnotherClass
child = MyClass.new;
end
end
end
>> MyAnotherClass.new
Votre méthode est intéressante, mais elle ne tient pas compte du fait que les classes peuvent être créées via 'new' dans d'autres classes :) Ce n'est pas le style MATLAB, je sais. Je voulais juste avoir un avant-goût de Ruby dans mes m-scripts. –
@Andrei Fokau: Si vous appelez 'CommonClass.new', alors vous devez passer' 'MyClass'' comme argument pour que MATLAB sache que vous voulez créer un objet de classe' MyClass'. Cependant, si vous exécutez 'MyClass.new', qui appelle la méthode statique' new' de la superclasse, alors 'getStaticCallingClassName' est exactement ce dont vous avez besoin. Voir ma modification. – Jonas
Si j'essaie d'exécuter 'MyAnotherClass.new' qui appelle' MyClass.new' dans son constructeur (voir ma question mise à jour), alors j'obtiens une boucle infinie. Y a-t-il une solution pour cela? –