Arabirim, ilgisiz nesnelerin birbiriyle iletişim kurmasına olanak sağlayan bir yöntem bildirimleri koleksiyonudur. Örneğin, ActionScript 3.0, bir sınıfın olay nesnelerini işlemek için kullanabileceği yöntem bildirimlerini içeren IEventDispatcher arabirimini tanımlar. IEventDispatcher arabirimi, nesnelerin birbirine olay nesnelerini iletmesi için standart bir yol oluşturur. Aşağıdaki kod, IEventDispatcher arabiriminin tanımını gösterir:
public interface IEventDispatcher
{
function addEventListener(type:String, listener:Function,
useCapture:Boolean=false, priority:int=0,
useWeakReference:Boolean = false):void;
function removeEventListener(type:String, listener:Function,
useCapture:Boolean=false):void;
function dispatchEvent(event:Event):Boolean;
function hasEventListener(type:String):Boolean;
function willTrigger(type:String):Boolean;
}
Arabirimler, bir yöntemin arabirimi ile uygulaması arasındaki ayrımı esas alır. Bir yöntemin arabirimi, yöntemin adı, tüm parametreleri ve döndürme türü gibi yöntemi çağırmak için gerekli olan tüm bilgileri içerir. Yöntemin uygulaması, yalnızca arabirim bilgilerini değil, yöntemin davranışını yürüten çalıştırılabilir deyimleri de içerir. Arabirim tanımı yalnızca yöntem arabirimlerini içerir ve arabirimi uygulayan tüm sınıflar, yöntem uygulamalarını tanımlamaktan sorumludur.
ActionScript 3.0'da, EventDispatcher sınıfı, tüm IEventDispatcher arabirim yöntemlerini tanımlayıp yöntemlerin her birine yöntem gövdeleri ekleyerek IEventDispatcher arabirimini uygular. Aşağıdaki kod, EventDispatcher sınıfı tanımından bir alıntıdır:
public class EventDispatcher implements IEventDispatcher
{
function dispatchEvent(event:Event):Boolean
{
/* implementation statements */
}
...
}
IEventDispatcher arabirimi, olay nesnelerini işlemek ve IEventDispatcher arabirimini uygulayan diğer nesnelere de bu olay nesnelerini iletmek için EventDispatcher örneklerinin kullandığı bir protokol görevi görür.
Arabirimin başka bir açıklaması da, veri türünü tıpkı sınıfın tanımladığı gibi tanımlamasıdır. Aynı şekilde, tıpkı sınıf gibi, arabirim de tür ek açıklaması olarak kullanılabilir. Bir veri türü olarak arabirim, veri türü gerektiren
is
ve
as
operatörleri gibi operatörlerle de kullanılabilir. Ancak sınıfın aksine, bir arabirim başlatılamaz. Bu ayrım da birçok programcının arabirimleri soyut veri türleri olarak ve sınıfları da somut veri türleri olarak değerlendirmesine neden olmuştur.
Arabirimi tanımlama
Bir arabirim tanımının yapısı, sınıf tanımının yapısına benzer; tek fark, arabirimin yalnızca herhangi bir yöntem gövdesi içermeyen yöntemleri içerebilmesidir. Arabirimler, değişken veya sabitleri içeremez ancak alıcı ve ayarlayıcıları içerebilir. Bir arabirimi tanımlamak için,
interface
anahtar sözcüğünü kullanın. Örneğin, şu IExternalizable arabirimi, ActionScript 3.0'da flash.utils paketinin parçasıdır. IExternalizable arabirimi, bir nesnenin serileştirilmesi, başka bir deyişle nesnenin bir aygıtta depolanmaya veya ağda taşınmaya uygun bir biçime dönüştürülmesine yönelik bir protokolü tanımlar.
public interface IExternalizable
{
function writeExternal(output:IDataOutput):void;
function readExternal(input:IDataInput):void;
}
IExternalizable arabirimi
public
erişim denetimi değiştiricisi ile bildirilir. Arabirim tanımları yalnızca
public
ve
internal
erişim denetimi belirticileri tarafından değiştirilebilir. Bir arabirim tanımının içindeki yöntem bildirimleri, herhangi bir erişim denetimi belirticisi içeremez.
ActionScript 3.0, arabirim adlarının
I
büyük harfiyle başladığı bir kuralı izler ancak arabirim adı olarak herhangi bir geçerli tanımlayıcıyı kullanabilirsiniz. Arabirim tanımları genellikle paketin üst düzeyine yerleştirilir. Arabirim tanımları bir sınıf tanımının içine veya başka bir arabirim tanımının içine yerleştirilemez.
Arabirimler başka bir veya birkaç arabirimi genişletebilir. Örneğin, aşağıdaki IExample arabirimi, IExternalizable arabirimini genişletir:
public interface IExample extends IExternalizable
{
function extra():void;
}
IExample arabirimini uygulayan tüm sınıfların yalnızca
extra()
yöntemi için değil, aynı zamanda IExternalizable arabiriminden miras alınan
writeExternal()
ve
readExternal()
yöntemleri için de uygulamalar içermesi gerekir.
Bir sınıfta arabirim uygulama
Sınıf, bir arabirim uygulayabilen ActionScript 3.0 dil öğesidir. Bir veya daha fazla arabirim uygulamak için sınıf bildiriminde
implements
anahtar sözcüğünü kullanın. Aşağıdaki örnek, IAlpha ve IBeta adında iki arabirimi ve bunların her ikisini uygulayan
Alpha
adında bir sınıfı tanımlar:
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 {}
}
Arabirim uygulayan bir sınıfta, uygulanan yöntemlerin şunları yapması gerekir:
-
public
erişim denetimi tanımlayıcısını kullanma.
-
Arabirim yöntemiyle aynı adı kullanma.
-
Veri türlerinin her biri arabirim yöntemi parametresi veri türüyle eşleşen, aynı sayıda parametreye sahip olma.
-
Aynı döndürme türünü kullanma.
public function foo(param:String):String {}
Ancak uyguladığınız yöntemlerin parametrelerini adlandırma şeklinizde esnekliğe sahip olursunuz. Uygulanan yöntemdeki parametre sayısının ve her parametrenin veri türünün, arabirim yöntemininkilerle eşleşmesi gerekse de, parametre adlarının eşleşmesi gerekmez. Örneğin, önceki örnekte,
Alpha.foo()
yönteminin parametresi
param
olarak adlandırılır:
Ancak parametre,
IAlpha.foo()
arabirim yönteminde
str
olarak adlandırılır:
function foo(str:String):String;
Ayrıca varsayılan parametre değerlerinde de esnekliğe sahip olursunuz. Bir arabirim tanımı, varsayılan parametre değerlerine sahip işlev bildirimleri içerebilir. Böyle bir işlev bildirimini uygulayan yöntemin, arabirim tanımında belirtilen değerle aynı veri türünün üyesi olan bir varsayılan parametre değerine sahip olması gerekir ancak gerçek değerin eşleşmesi gerekmez. Örneğin, aşağıdaki kod, 3 varsayılan parametre değerine sahip bir yöntemi içeren arabirimi tanımlar:
interface IGamma
{
function doSomething(param:int = 3):void;
}
Aşağıdaki sınıf tanımı, Igamma arabirimini uygular ancak farklı bir varsayılan parametre değeri kullanır:
class Gamma implements IGamma
{
public function doSomething(param:int = 4):void {}
}
Bu esnekliğin nedeni, arabirim uygulama kurallarının özellikle veri türü uyumluluğunu sağlamak üzere tasarlanmış olması ve aynı parametre adları ve varsayılan parametre değerlerinin zorunlu tutulmasının, bu hedefin elde edilmesinde gerekli olmamasıdır.