Matlab动态属性,限制访问addprop

时间:2015-09-09 11:52:34

标签: matlab oop

我正在创建一个工具箱,我想动态地将特定属性添加到类的实例中,同时限制用户'能够添加属性。

我正在考虑对象类的基线功能,称为模型。每个模型都可以使用其他功能进行修饰,如Bootstrap CI,排列测试等。

我希望将附加功能附加到对象实例。根据我的理解,使用装饰器模式将我的模型的实例存储在其中,但是如果我有多个装饰器作用于同一个对象,我不知道该怎么做 - 例如,两个引导CI&和置换测试。我认为只有通过调用为模型类定义的方法向对象添加动态属性才是最佳选择,但我不知道如何对其进行编程,同时使用户无法添加属性对象。

1 个答案:

答案 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)。