AS3: невозможно иметь геттеры и сеттеры для одной и той же переменной в разных интерфейсах? - PullRequest
3 голосов
/ 25 февраля 2011

Следующий код, кажется, создает неоднозначность для компилятора (см. Комментарий с ошибкой внизу)Разве нельзя разделить геттеры и сеттеры между интерфейсами?

public interface GetterInterface 
{
    function get test():int;
}

public interface SetterInterface 
{
    function set test(value:int):void;
}

public interface SplitTestInterface extends GetterInterface, SetterInterface
{

}

public class SplitTest implements SplitTestInterface
{

    public function SplitTest() 
    {

    }

    /* INTERFACE test.SetterInterface */

    public function set test(value:int):void 
    {

    }

    /* INTERFACE test.GetterInterface */

    public function get test():int 
    {
        return 0;
    }

}

//Somewhere...
var splitTest:SplitTestInterface = new SplitTest();
splitTest.test = 2; //Error: Property is read-only.

Ответы [ 2 ]

2 голосов
/ 26 февраля 2011

Я собрал следующее (которое практически идентично вашему коду) и отлично работает как для методов get, так и для set.

/* IGet.as */
package {
    public interface IGet 
    {
        function get test():int;
    }
}


/* ISet.as */
package {
    public interface ISet 
    {
        function set test(i:int):void;
    }
}


/* ISplit.as */
package {
    public interface ISplit extends IGet, ISet {
    }
}

/* SplitTest.as */
package {
    public class SplitTest implements ISplit {

        public function SplitTest() {
        }

        public function set test(i:int):void {
            trace("Set");
        }

        public function get test():int {
            trace("Get");
        }
    }
}

На основной временной линии:

var foo:SplitTest = new SplitTest();
foo.test;
foo.test = 1;

И выходы:

Get
Set
0 голосов
/ 01 марта 2011

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

Property SplitTestInterface::test not found on SplitTest and there is no default value.

Таким образом, ответ - нет.Он не поддерживается языком и не поддерживается средой выполнения.Это хорошо, хотя, я бы никогда не хотел видеть это в рабочем коде.

Редактировать: Мой тест был испорчен, на самом деле он отлично работает во время выполнения.

...