Uma classe é o único elemento de linguagem do ActionScript 3.0 que pode implementar uma interface. Use a palavra-chave
implements
em uma declaração de classe para implementar uma ou mais interfaces. O exemplo a seguir define duas interfaces, IAlpha e IBeta
,
e uma classe, Alpha, que implementa as duas:
interface IAlpha
{
function foo(str:String):String;
}
interface IBeta
{
function bar():void;
}
class Alpha implements IAlpha, IBeta
{
public function foo(param:String):String {}
public function bar():void {}
}
Em uma classe que implementa uma interface, os métodos implementados devem fazer o seguinte:
-
Usar o identificador de controle de acesso
public
.
-
Usar o mesmo nome do método da interface.
-
Ter o mesmo número de parâmetros, cada um com tipos de dados que correspondam aos tipos de dados do parâmetro do método da interface.
-
Usar o mesmo tipo de retorno.
public function foo(param:String):String {}
No entanto, você realmente tem alguma flexibilidade quanto a como nomear os parâmetros de métodos implementados. Embora o número de parâmetros e o tipo de dados de cada parâmetro no método implementado devam corresponder àquele do método da interface, os nomes de parâmetros não precisam corresponder. Por exemplo, no exemplo anterior o parâmetro do método
Alpha.foo()
é denominado
param
:
Mas o parâmetro é denominado
str
no método da interface
IAlpha.foo()
:
function foo(str:String):String;
Você tem também alguma flexibilidade com valores de parâmetro padrão. Uma definição de interface pode incluir declarações de função com valores de parâmetro padrão. Um método que implementa um declaração de função desse tipo deve ter um valor de parâmetro padrão que seja membro do mesmo tipo de dados que o valor especificado na definição da interface, mas o valor real não precisa corresponder. Por exemplo, o código a seguir define uma interface que contém um método com um valor de parâmetro padrão 3:
interface IGamma
{
function doSomething(param:int = 3):void;
}
A seguinte definição de classe implementa a interface Igamma, mas usa um valor do parâmetro padrão diferente:
class Gamma implements IGamma
{
public function doSomething(param:int = 4):void {}
}
O motivo dessa flexibilidade é que as regras para implementação de uma interface são projetadas especificamente para garantir a compatibilidade do tipo de dados, e exigir nomes de parâmetros idênticos e valores de parâmetros padrão não é necessário para atingir esse objetivo.