我想在 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
性质是静态的,由定义类时为其提供的属性定义。它不能基于每个实例进行更改。
但是您仍然可以获得所需的行为。您可以做的是使E
和adjL
都依赖于,并具有保存实际数据的另外两个属性realE
和realAdjL
。让E
和adjL
的获取者查看这两个字段,并从存在的任何一个字段中派生其值。
你甚至不一定要让E
和adjL
依赖才能完成这项工作。您可以只为E
和adjL
(如get.E
和set.E
)定义 getter 和 setter,它们检查它们的基础字段,并从填充的任何字段中重建这些属性的可观察值。
您可以将E
和adjL
都定义为依赖属性,并具有包含实际值的源属性以及描述其源的标志,然后定义 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