我想在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
计算)?
答案 0 :(得分:1)
不直接。属性的dependent
性质是静态的,并由您在定义类时提供的属性定义。它无法在每个实例的基础上进行更改。
但你仍然可以得到你想要的行为。您可以做的是使E
和adjL
相互依赖,并拥有两个保存实际数据的其他属性realE
和realAdjL
。让E
和adjL
的getter查看这两个字段,并从存在的任何字段中获取它们的值。
您甚至不需要依赖E
和adjL
来完成这项工作。你可以只定义getter和setter E
和adjL
(例如get.E
和set.E
)来同时检查他们的潜在领域和重建观察到的值,这些属性从哪个字段已填充。
答案 1 :(得分:0)
您可以将E
和adjL
定义为依赖,并且具有包含实际值的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