Bạn không thể thêm các phương pháp như bạn thêm thuộc tính động. Tuy nhiên, có hai cách để triển khai các phương thức mới trong quá trình phát triển mà không yêu cầu bạn phải tải lại dữ liệu mỗi lần.
(1) Tôi viết các phương thức chuẩn làm các hàm riêng biệt và gọi chúng là myMethod(obj)
trong quá trình phát triển. Khi tôi chắc chắn rằng chúng ổn định, tôi thêm chữ ký của chúng vào tệp định nghĩa lớp - điều này yêu cầu một số clear classes
, tất nhiên, nhưng nó bị trì hoãn nhiều và thỉnh thoảng bạn có thể phải tắt Matlab, .
(2) Với phương thức thiết lập/nhận, mọi thứ trở nên phức tạp hơn một chút. Nếu bạn đang sử dụng các thuộc tính mới dynamicprops
để thêm thuộc tính mới, bạn cũng có thể chỉ định phương thức đặt/nhận của họ (rất có thể, các phương pháp/chức năng này sẽ muốn nhận tên của thuộc tính để họ biết phải tham khảo):
addprop(obj,'new_prop');
prop = findprop(obj,'new_prop');
prop.SetMethod = @(obj,val)yourCustomSetMethod(obj,val,'new_prop')
EDIT
(2,1) Dưới đây là một ví dụ về cách thiết lập thuộc tính ẩn để lưu trữ và lấy kết quả (dựa trên jmlopez' answer). Rõ ràng điều này có thể được cải thiện rất nhiều nếu bạn có ý tưởng tốt hơn về những gì bạn đang thực sự thiết kế
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
Bạn có thể thêm các phương thức mới miễn là bạn thực hiện các lớp rõ ràng sau đó, nhưng bạn muốn thực hiện nó. Tôi không nghĩ rằng sẽ làm việc nói chung. –