考虑以下 Matlab (2009a) 类:
classdef BigDeal < handle
properties
hugeness = magic(2000);
end
methods
function self = BigDeal()
end
end
end
classdef BigProxy < handle
properties(Dependent)
hugeness
end
properties(Access = private)
bigDeal
end
methods
function self = BigProxy(bigDeal)
self.bigDeal = bigDeal;
end
function value = get.hugeness(self)
value = self.bigDeal.hugeness;
end
end
end
现在考虑它们的以下用法:
设置:
>> b = BigDeal
b =
BigDeal handle
Properties:
hugeness: [10x10 double]
Methods, Events, Superclasses
一层:
>> pb = BigProxy(b)
pb =
BigProxy handle
Properties:
hugeness: [10x10 double]
Methods, Events, Superclasses
两层:
>> ppb = BigProxy(pb)
ppb =
BigProxy handle with no properties.
Methods, Events, Superclasses
问题: 为什么我的双层代理看不到
hugeness
,而单层可以?可以计算相关属性 - 但出于某种原因,这是否仅深入一层?更新: 有关解决方法,请参阅下面的答案。
最佳答案
这里的问题有两个:
BigProxy
对象构造函数旨在接受具有(非依赖)hugeness
属性(如 BigDeal
对象)的输入对象,然后 BigProxy
对象可以访问该对象以计算其自己的依赖 hugeness
属性的值。 BigProxy
时,您正在将 BigProxy
对象传递给 ppb
构造函数,并且您显然无法从另一个依赖属性计算依赖属性。例如,这是我尝试访问 ppb.hugeness
时抛出的错误:??? In class 'BigProxy', the get method for Dependent property 'hugeness'
attempts to access the stored property value. Dependent properties don't
store a value and can't be accessed from their get method.
换句话说,外部
BigProxy
对象尝试通过访问内部 hugeness
对象的 hugeness
存储值来计算其依赖 BigProxy
属性的值,但由于它是 dependent property ,因此没有存储值。 我认为解决这种情况的方法是让
BigProxy
构造函数检查其输入参数的类型以确保它是 BigDeal
对象,否则抛出错误。