actionscript-3: наследование интерфейса рефакторинга, чтобы избавиться от неоднозначной ошибки ссылки - PullRequest
1 голос
/ 15 мая 2010

представьте себе, что есть два интерфейса, организованных через составной шаблон, один из них имеет метод dispose среди других методов:

interface IComponent extends ILeaf {
    ...
    function dispose() : void;
}

interface ILeaf {
    ...
}

В некоторых реализациях есть кое-что общее (скажем, id), поэтому есть еще два интерфейса:

interface ICommonLeaf extends ILeaf {
    function get id() : String;
}

interface ICommonComponent extends ICommonLeaf, IComponent {
}

пока все хорошо. но есть другой интерфейс, который также имеет метод dispose:

interface ISomething {
    ...
    function dispose() : void;
}

и ISomething наследуются ICommonLeaf:

interface ICommonLeaf extends ILeaf, ISomething {
    function get id() : String;
}

Как только метод dispose вызывается для экземпляра, который реализует интерфейс ICommonComponent, компилятор завершается ошибкой с неоднозначной ошибкой ссылки, поскольку ISomething имеет метод с именем dispose, а ILeaf также dispose метод, оба живут в разных интерфейсах (IComponent, ISomething) в дереве наследования ICommonComponent.

Интересно, как справиться с ситуацией, если

  • IComponent, ILeaf и ISomething не могут измениться.
  • составная структура также должна работать для ICommonLeaf & ICommonComponent
  • и ICommonLeaf & ICommonComponent должны соответствовать типу ISomething.

это может быть проблема, связанная с ActionScript-3. я не проверял, как другие языки (например, Java) обрабатывают подобные вещи.

Ответы [ 3 ]

3 голосов
/ 16 мая 2010

Вы ищете решение проблемы с бриллиантами. C # имеет подход к этому, но в основном я бы выделил метод «распоряжаться» из ваших интерфейсов и создал бы новый «IDisposable».

Если одно и то же имя, например «id», используется дважды, это выглядит как проблема в вашем коде с неоднозначным именем. Мы начали добавлять префиксы к свойствам и методам. Представьте, что у вас есть свойство «имя», которое принадлежит двум разным вещам. Как "displayName" и "uniqueName".

Это также помогает при автозаполнении. Если DisplayObject является ILayoutObject и вы набираете displayObject.layout, вы получите все макет выпущен.

1 голос
/ 16 мая 2010

Кажется, что литье решает неоднозначность, хотя это далеко не аккуратно.

class SomeComponent implements ICommonComponent {}

var c : ICommonComponent = new SomeComponent();
trace(ISomething(c).dispose()); //compiles
trace(IComponent(c).dispose()); //compiles
trace(c.dispose());    //fails
0 голосов
/ 15 мая 2010

Насколько я знаю, в Actionscript нет подходящего способа решить эту проблему.

Единственное, о чем я могу думать, это рефакторинг ваших интерфейсов, чтобы избежать столкновения имен, что, к сожалению, не всегда возможно.

Не знаю о Java, но в C # есть способ справиться с этим посредством явной реализации интерфейса .

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