2012-04-29 2 views
0



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

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;, все идет хорошо.

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

Благодарим за внимание.

ответ

0

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

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

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

+0

Спасибо! Да, уродливый и не очень «удобный», так как мой код будет упакован в lib для других разработчиков. Но с четкой документацией, которая позволяет мне иметь хороший дизайн lib. (я хотел бы ответить на ваш вопрос, но я не могу, так как моя «репутация» еще не достаточно хороша ...) – Clem

1

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

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

+1

Я не удивлен, это все-таки вспышка. lol –

+0

Простите, например, я забыл «Я» перед «ReadOnly» в объявлении интерфейса «IReadWrite». Итак, мой интерфейс IReadWrite действительно расширяет интерфейс IReadOnly. Я редактирую свой пост, чтобы исправить эту ошибку. – Clem

Смежные вопросы