2010-04-21 2 views
0

Я пытаюсь создать класс ActionScript 3, который реализует два интерфейса. Интерфейсы содержат функции-члены с разными подписями, но то же самое название:Конфликты имен членов интерфейса в ActionScript 3

public interface IFoo 
{ 
    function doStuff(input:int):void; 
} 

public interface IBar 
{ 
    function doStuff(input1:String, input2:Number):void; 
} 

public class FooBar implements IFoo, IBar 
{ 
    // ??? 
} 

В C# (например), это не является проблемой, так как методы могут быть перегружены, но ActionScript не поддерживает перегрузку. Есть ли способ создать класс, который реализует оба интерфейса?

ответ

2

Нет, к сожалению, это невозможно, и это связано с тем, что вы уже указали: ActionScript 3 не поддерживает перегрузку элементов. Это позор, но это неудачный . правда

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

public namespace foo; 
public namespace bar; 

foo function doStuf(input:int):void 
{ 
    // ... 
} 

bar function doStuff(input1:String, input2:String):void 
{ 
    // ... 
} 

Затем вы ссылаетесь на методы, квалифицируя их так:

foo::doStuff(1); 
bar::doStuff("foo", "bar"); 

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

+0

Я боялся, что это так, но спасибо за ясный ответ. Не могли бы вы рассказать о том, что вы имеете в виду, используя «составной шаблон»? Вы имеете в виду создание двух классов, по одному для каждого интерфейса, а затем позволяя им общаться или делиться каким-то образом? – Aaron

+0

Да, все. Чтобы облегчить связь, я бы предположил, что вы позволили агрегирующему классу обрабатывать сообщение. –

+0

Боюсь, что мой последний комментарий, возможно, был неясным. Я имею в виду, что если у вас есть два отдельных класса, по одному для каждого интерфейса, вы можете обернуть их в класс агрегатов, который хранит ссылки на экземпляры этих классов и облегчает любую связь между ними. Любые данные реализации могут быть разделены, если необходимо, с использованием внутреннего пространства имен (если они находятся в одном пакете) или с помощью пользовательских пространств имен. Это было бы похоже на класс друзей. Это, конечно, не идеально, но это что-то по крайней мере. –

1

Открытый класс FooBar должен будет реализовать оба интерфейса и таким образом внедрить перечисленные функции. Проблема заключается в том, что ActionScript не поддерживает перегрузку метода. Это хорошая функция, которую я пропустил из C# :(

+0

Вы правы; явные реализации интерфейса даже не нужны в C# для решения этой проблемы; простой метод перегрузки будет. Я обновил вопрос, чтобы отразить это. Однако был вопрос: «Есть ли способ создать класс, который реализует оба интерфейса?» поэтому ваш ответ на самом деле не является ответом. – Aaron

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