Arabirimler

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.