Matlab值类 - 无论如何从构造函数中更改属性的属性?

时间:2015-05-03 20:30:02

标签: matlab

我想在Matlab中创建一个代表图形的类。默认情况下,该类有2个属性:普通属性E表示adjacency matrix,依赖属性adjL表示adjacency list。默认构造函数类似g = graph(E)g.adjL基于g.E计算。

我想问是否还有,所以当我有另一个参数即g = graph(A, 'adjlist')时,将创建一个具有属性adjL的对象现在变为普通属性g.adjL= A和属性{{1现在变得依赖(根据E计算)?

2 个答案:

答案 0 :(得分:1)

不直接。属性的dependent性质是静态的,并由您在定义类时提供的属性定义。它无法在每个实例的基础上进行更改。

但你仍然可以得到你想要的行为。您可以做的是使EadjL相互依赖,并拥有两个保存实际数据的其他属性realErealAdjL。让EadjL的getter查看这两个字段,并从存在的任何字段中获取它们的值。

您甚至不需要依赖EadjL来完成这项工作。你可以只定义getter和setter EadjL(例如get.Eset.E)来同时检查他们的潜在领域和重建观察到的值,这些属性从哪个字段已填充。

答案 1 :(得分:0)

您可以将EadjL定义为依赖,并且具有包含实际值的source属性以及描述其源的标志,然后定义getter方法以确定是否实际应返回源代码或需要转换:

classdef graph
    properties (Access=private)
        sourcetype
        source
    end

    properties (Dependent)
        E
        adjL
    end

    methods
        function obj = graph(varargin)
            if nargin==1,
                obj.sourcetype = 'edge';
                obj.source = varargin{1};
            elseif nargin==2 && strcmp(varargin{2}, 'adjL')
                obj.sourcetype = 'adjL';
                obj.source = varargin{1};
            else
                error('Invalid input arguments');
            end
        end

        function ret = get.E(obj)
            if strcmp(obj.sourcetype, 'edge')
                ret = obj.source;
            else
                % convert source from adjL to E
            end
        end

        function ret = get.adjL(obj)
            if strcmp(obj.sourcetype, 'adjL')
                ret = obj.source;
            else
                % convert source from E to adjL
            end
        end
    end

end