Nie można dodawać metod takich jak właściwości dynamiczne. Istnieją jednak dwa sposoby wdrażania nowych metod podczas projektowania, które nie wymagają ponownego ładowania danych za każdym razem.
(1) Piszę standardowe metody jako oddzielne funkcje i wywołuj je jako myMethod(obj)
podczas programowania. Kiedy jestem pewien, że są stabilne, dodałem ich sygnaturę do pliku definicji klasy - to oczywiście wymaga clear classes
, ale jest to dużo opóźnione i od czasu do czasu może być konieczne wyłączenie Matlaba. .
(2) Metody ustawiania/pobierania sprawiają, że niektóre czynności są nieco trudniejsze. Jeśli używasz dynamicprops
do dodawania nowych właściwości, możesz również określić ich metody ustawiania/pobierania (najprawdopodobniej te metody/funkcje będą chciały otrzymać nazwę właściwości, aby wiedziały, do czego się odnoszą):
addprop(obj,'new_prop');
prop = findprop(obj,'new_prop');
prop.SetMethod = @(obj,val)yourCustomSetMethod(obj,val,'new_prop')
EDIT
(2,1) Oto przykład jak skonfigurować ukryty obiekt do przechowywania i pobierania wyników (w oparciu o jmlopez' answer). Oczywiście może to być o wiele lepsze, jeśli masz lepszy pomysł, co masz faktycznie projektowania
classdef myDynamicClass < dynamicprops
properties (Hidden)
name %# class name
store %# structure that stores the values of the dynamic properties
end
methods
function self = myDynamicClass(clsname, varargin)
% self = myDynamicClass(clsname, propname, type)
% here type is a handle to a basic datatype.
self.name_ = clsname;
for i=1:2:length(varargin)
key = varargin{i};
addprop(self, key);
prop = findprop(self, key);
prop.SetMethod = @(obj,val)myDynamicClass.setMethod(obj,val,key);
prop.GetMethod = @(obj)myDynamicClass.getMethod(obj,key);
end
end
function out = classname(self)
out = self.name_;
end
end
methods (Static, Hidden) %# you may want to put these in a separate fcn instead
function setMethod(self,val,key)
%# have a generic test, for example, force nonempty double
validateattributes(val,{'double'},{'nonempty'}); %# will error if not double or if empty
%# store
self.store.(key) = val;
end
function val = getMethod(self,key)
%# check whether the property exists already, return NaN otherwise
%# could also use this to load from file if the data is not supposed to be loaded on construction
if isfield(self.store,key)
val = self.store.(key);
else
val = NaN;
end
end
end
end
Możesz dodawać nowe metody, o ile później wyczyścisz klasy, ale chcesz je obejść. Nie sądzę, że to będzie działać ogólnie. –