Вопрос класса прокси Matlab. (re: зависимые свойства) - PullRequest
4 голосов
/ 03 марта 2011

Рассмотрим следующие классы 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

OneLayer:

>> pb = BigProxy(b)

pb = 

  BigProxy handle

  Properties:
    hugeness: [10x10 double]

  Methods, Events, Superclasses

TwoLayers:

>> ppb = BigProxy(pb)

ppb = 

  BigProxy handle with no properties.
  Methods, Events, Superclasses

Вопрос: Почему мой двухслойный прокси не может видеть hugeness, когда один слой может? Зависимые свойства могут быть рассчитаны - но почему-то это занимает всего один слой?


Обновление: См. Мой ответ ниже для обхода проблемы.

Ответы [ 2 ]

4 голосов
/ 03 марта 2011

Гновице дал хороший ответ на вопрос «почему», поэтому я наградил его зеленым чеком славы.Тем не менее, для тех, кто хочет обойти это, вы можете сделать что-то вроде этого:

classdef BigDeal < handle
    properties
        hugeness = magic(10000);
    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.getHugeness;
        end
    end
    methods(Access = private)
        function value = getHugeness(self)
            if isa(self.bigDeal,'BigProxy')
                value = self.bigDeal.getHugeness;
            else
                value = self.bigDeal.hugeness;
            end
        end
    end
end

, что позволит вам сделать следующее

>> b = BigDeal;
>> pb = BigProxy(b);
>> ppb = BigProxy(pb);

И каждый из {b,pb, ppb} будут иметь одинаковые открытые методы и свойства.Единственным недостатком является то, что мне пришлось (излишне ИМХО) загромождать BigProxy с помощью нового частного геттера.

4 голосов
/ 03 марта 2011

Проблема здесь двоякая:

  1. Конструктор объекта BigProxy предназначен для приема входного объекта, который имеет (не зависимое) свойство hugeness (например, объект BigDeal), к которому объект BigProxy может затем получить доступ. вычислить значение для его собственного зависимого hugeness свойства.

  2. Вы передаете объект 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, но нет сохраненного значения, так как он зависимое свойство .

Я думаю, что исправление для ситуации, подобной этой, было бы для конструктора BigProxy, чтобы проверить тип входного аргумента, чтобы убедиться, что это объект BigDeal, и в противном случае выдать ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...