考虑以下 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 对象,否则抛出错误。

    10-07 17:22