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



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

我想问一下是否有,所以当我有另一个参数(即g = graph(A, 'adjlist'))时,将使用属性创建一个对象adjL该对象现在成为正常的属性g.adjL= A并且属性E现在变得依赖(根据g.adjL计算)?

不是直接的。属性的dependent性质是静态的,由定义类时为其提供的属性定义。它不能基于每个实例进行更改。

但是您仍然可以获得所需的行为。您可以做的是使EadjL都依赖于,并具有保存实际数据的另外两个属性realErealAdjL。让EadjL的获取者查看这两个字段,并从存在的任何一个字段中派生其值。

你甚至不一定要让EadjL依赖才能完成这项工作。您可以只为EadjL(如get.Eset.E)定义 getter 和 setter,它们检查它们的基础字段,并从填充的任何字段中重建这些属性的可观察值。

您可以将EadjL都定义为依赖属性,并具有包含实际值的源属性以及描述其源的标志,然后定义 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

最新更新