我正在创建一个工具箱,我想动态地将特定属性添加到类的实例中,同时限制用户'能够添加属性。
我正在考虑对象类的基线功能,称为模型。每个模型都可以使用其他功能进行修饰,如Bootstrap CI,排列测试等。
我希望将附加功能附加到对象实例。根据我的理解,使用装饰器模式将我的模型的实例存储在其中,但是如果我有多个装饰器作用于同一个对象,我不知道该怎么做 - 例如,两个引导CI&和置换测试。我认为只有通过调用为模型类定义的方法向对象添加动态属性才是最佳选择,但我不知道如何对其进行编程,同时使用户无法添加属性对象。
答案 0 :(得分:1)
我使用Dependent属性和重载方法而不是动态属性来处理设计。例如:
<强> Model.m 强>
classdef (Abstract) Model < handle
properties (Access = public)
commonProp1
commonProp2 % etc
end
properties (Dependent, GetAccess = public, SetAccess = private)
ciEstimate
end
properties (Access = private)
isFitted = false;
ciEstimateInternal = []
end
methods (Abstract, Access = public)
ciEstimate = calcCIEstimate(obj)
fit(obj)
end
methods
function val = get.ciEstimate(obj)
if ~obj.isFitted
error('Model not yet fitted.')
end
if isempty(obj.ciEstimateInternal)
obj.ciEstimateInternal = obj.calcCIEstimate;
end
val = obj.ciEstimateInternal;
end
end
end
<强> Type1Model.m 强>
classdef Type1Model < Model
methods (Access = public)
function fit(obj)
% Do some fitting stuff for a type 1 model
obj.isFitted = true;
end
function ciEstimate = calcCIEstimate(obj)
% Do it in a bootstrap way
end
end
end
<强> Type2Model.m 强>
classdef Type2Model < Model
methods (Access = public)
function fit(obj)
% Do some fitting stuff for a type 2 model
obj.isFitted = true;
end
function ciEstimate = calcCIEstimate(obj)
% Do it in a posterior variance way
end
end
end
使用此设计,每种模型类型都可以以自己的方式拟合,并且可以以自己的方式计算CI估计值。模型将具有一致的属性ciEstimate
,该属性在第一次访问时按需计算,但在内部存储在模型对象中(ciEstimateInternal
)。