2010-10-23 2 views
2

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

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

ответ

2

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

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

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.

+0

У меня есть 10 страниц с 10 различными наборами аргументов ... Я не думаю, что определение нескольких интерфейсов в этом случае принесло бы мне большую выгоду. Во всяком случае, ваша идея свежая, и я мог бы использовать ее в других ситуациях. Благодаря! – Vitamon

+0

У меня была такая ситуация. Я реализовал кучу цветовых пространств, а некоторые требуют освещения, другие - нет. Поэтому я просто сделал обертку без ничего («IColorSpace») и создал два интерфейса, которые имеют определения рассматриваемых функций ('fromXYZ (...)', 'toXYZ()'), один с источником света ('IColorSpace, IColorSpaceWithIlluminant') и один без (' IColorSpace, IColorSpaceWithoutIlluminant'). Работает отлично, спасибо! – Tox

1

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

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

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

1

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

0

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

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

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

+0

Да, идея передачи объекта как: initPage ({text: myXML. @ Title, color: myXML. @ Color}) выглядит лучше, чем ... args. благодаря! – Vitamon

0

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

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

//any class that implements IPage can have a different 
//set of arguments 
public class A implements IPage 
{ 
    //for example... 
    private var obj1:String; 
    private var obj2:int; 

    public function A(obj1:String , obj2:int) 
    { 
     this.obj1 = obj1; 
     this.obj2 = obj2; 
    } 

    public function initPage():void 
    { 
     //obj1 & ob2 are available here 
    } 
} 
+0

Я использую экземпляры MovieClip, которые уже находятся на сцене, поэтому их конструкторы вызывают, прежде чем я смогу их инициализировать с помощью определенных данных, загруженных из XML. – Vitamon

0

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

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

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

+0

Он по-прежнему не решает проблему передачи определенного набора параметров на конкретную страницу. Я думаю, что я мог бы передавать параметры в классе Object, например: initPage ({text: myXML. @ Title, color: myXML. @ Color}), это было бы более строгим, потому что мне пришлось бы проверять, по крайней мере, имена полей. – Vitamon

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