Переопределение методов Actionscript в расширенных интерфейсах против Java? - PullRequest
4 голосов
/ 20 октября 2011

Я гораздо лучше знаком с семантикой Java класса и интерфейса, чем с семантикой Actionscript, но у меня есть пример кода, который работает в Java и не работает в Actionscript.Это уныние является серьезной проблемой, поскольку я пытаюсь сгенерировать код для создания своих объектов-значений Actionscript из DTO Java, и если семантика не совпадает, у меня большие проблемы.

Вот код, который работает на Java ине удается скомпилировать в Actionscript:

Интерфейс A:

public interface Ia {
    function makeCopy():Ia;
}

Интерфейс B:

public interface Ib extends Ia {
}

Класс B (не компилируется):

public class B implements Ib {
    public function makeCopy():Ib {
        return null;
    }
}

Я не понимаю, почему класс B выдает ошибку компиляции о несовместимой сигнатуре для "makeCopy", когда интерфейс B явно расширяет интерфейс A ... таким образом, нет нарушения типа или несовместимости.Если это всего лишь ограничение в ActionScript, может ли кто-нибудь предложить способ перекодирования?

ПРИМЕЧАНИЕ. Я уже пытался изменить интерфейс B на этот, и он вызвал ошибку в интерфейсе B (который работает в Java):

public interface Ib extends Ia {
    function makeCopy():Ib;
}

Ответы [ 3 ]

1 голос
/ 20 октября 2011

Из контекста ActionScript возвращаемый тип makeCopy () имеет несовместимую подпись.

Интерфейс Ia определяет makeCopy, возвращающий Ia.

Расширение интерфейса Ib вернет базу Ia из makeCopy. Добавление makecopy (): Ib к интерфейсу Ib является несовместимым переопределением для определения в Ia.

В классе B несовместимая подпись ожидает, что makeCopy вернет Ia.

Возможно, то, что вы пытаетесь достичь, больше похоже на абстрактный класс, где вы должны расширить классы A и B.

1 голос
/ 20 октября 2011

В AS3 сигнатуры методов должны быть идентичны как в реализации, так и в наследовании, поэтому, если вы изначально определили тип возврата makeCopy как Ia, он должен оставаться во всех дочерних интерфейсах и их реализациях.

Однако вы можете вернуть экземпляр объекта, который реализует Ib через функцию, подписанную Ia, потому что она все еще будет действительной реализацией Ia:

public class B implements Ib {

    public function makeCopy():Ia {
        return this;
    }

    public function B() {
        trace(makeCopy() is Ia);  //true
        trace(makeCopy() is Ib);  //true
        trace(makeCopy() is B);   //true
    }
}
0 голосов
/ 20 октября 2011

"makeCopy ()" на интерфейсе возвращает Ia.Тогда как в реализации он возвращает Ib.Если Ib не является Ia, оно потерпит неудачу.

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