ActionScript странный доступ к геттеру / сеттеру



Задумывая библиотеку в соответствии с шаблоном проектирования «Factory», мне нужно различать интерфейсы, которые следует рассматривать как «только для чтения», и те, которые также могут иметь право записи. Итак, я разрабатываю следующую схему:

public interface IReadOnly {
    function get value (): Number;
}
public interface IReadWrite extends IReadOnly {
    function set value (v:Number): void;
}
internal class ReadWrite implements IReadWrite {
    public function get value (): Number {
        return m_value;
    }
    public function set value (v:Number): void {
        m_value = v;
    }
    protected var m_value:Number;
}

Итак, проблема: я не могу получить доступ к получателю в экземпляре класса. Flex откажется компилировать следующий код:

function doSomething (rw:IReadWrite): void {
    var num:Number = rw.value;
}

Flex сообщает мне: «1178: Попытка доступа к недоступному значению свойства через ссылку со статическим типом IReadWrite».
Когда я заменяю установщик простой функцией, такой как function setValue (v:Number): void;, все идет хорошо.

Есть кто-нибудь уже сталкивались с этим сценарием? Это ошибка компилятора? Какие параметры компилятора могут решить проблему?

Спасибо за внимание.


person Clem    schedule 29.04.2012    source источник


Ответы (2)


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

    function doSomething (rw:IReadWrite): void {
    var num:Number = IReadOnly(rw).value;
}

Это выглядит некрасиво, но выполняет свою работу.

person pbuchheit    schedule 23.04.2013
comment
Спасибо! Да, некрасиво и не очень удобно, так как мой код будет упакован в библиотеку для других разработчиков. Но с четкой документацией, которая позволила мне получить хороший дизайн библиотеки. (Я хотел бы уточнить ваш ответ, но не могу, поскольку моя репутация еще недостаточно хороша ...) - person Clem; 26.06.2013

Ваш интерфейс IReadWrite неправильно расширяет класс ReadWrite; Необходимо расширить интерфейс IReadOnly.

Я удивлен, что компилятор даже позволяет объявить интерфейс, расширяющий класс.

person meddlingwithfire    schedule 29.04.2012
comment
Извините, в этом примере я забыл I перед ReadOnly в объявлении интерфейса IReadWrite. Итак, мой интерфейс IReadWrite действительно расширяет интерфейс IReadOnly. Я редактирую свой пост, чтобы исправить эту ошибку. - person Clem; 29.04.2012