Как определить метод интерфейса с разными аргументами в AS3? - PullRequest
2 голосов
/ 24 октября 2010

Я пытаюсь определить интерфейс, в котором один метод (initPage) должен иметь разные аргументы в каждой реализации. Как я могу это сделать? Использование ... args для меня не очень хорошо, потому что я теряю строгую проверку типов.

public interface IPage {
    function initPage(...args):void;
    function showPage():void;
    function hidePage():void;
    function removePage():void;
}

Ответы [ 6 ]

2 голосов
/ 30 марта 2011

Вы знаете, что можете реализовать более одного интерфейса?

Я думаю, что вы должны сохранить свой фактический интерфейс, исключая «проблемный» метод, и создать другие интерфейсы, каждый из которых имеет свой метод

public interface IPage 
{      
    function showPage():void;
    function hidePage():void;
    function removePage():void;
}

public interface IPrettyPage
{
    function initPage(p:PrettyArg);
}

public interface IUglyPage
{
    function initPage(u:UglyArg);
}


// your implementation Class
package 
{
    public class Page extends Sprite implements IPage, IPrettyPage
    {
        // Implementation
    }
}

В любом случае, вот пример с еще одной хорошей идеей, НО - это код Java: http://www.java2s.com/Code/Java/Language-Basics/Implementmultipleinterfaces.htm

Я не тестировал, но я почти уверен, что эта проблема отличается вAS3.

1 голос
/ 24 октября 2010

Наличие разных аргументов для разных реализаций интерфейса противоречит основной цели интерфейса.Если бы у вас была только ссылка на интерфейс, как вы узнали бы, какие аргументы передать?

1 голос
/ 24 октября 2010

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

Цель интерфейса - определить общий набор сигнатур методов всех классов, которые реализуют этот интерфейс.

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

0 голосов
/ 24 октября 2010

Если различные объекты, которые initPage принимают в качестве параметра, имеют определенную структуру, все они могут расширять другой интерфейс или родительский класс. Например, имеющий:

function initPage(arg:DisplayObject):void;//For example

initPage может принимать что-либо вроде Bitmap, Sprite или MovieClip объектов, сохраняющих хотя бы некоторую строгую типизацию. Код в каждой реализации метода может по крайней мере убедиться, что такая реализация получает ожидаемый тип объекта.

0 голосов
/ 24 октября 2010

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

0 голосов
/ 24 октября 2010

Использование ... args для меня нехорошо, потому что я теряю строгую проверку типов.

так что вы знаете определенное количество аргументов и даже их типы, поэтому единственныйНеудобство, которое я могу себе представить, состоит в том, что вам часто придется вызывать эту функцию без аргументов.я обычно решаю это так: private function doSomething(e: Event = null):void {}

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

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