Sınıflar

Sınıf, bir nesnenin soyut temsilidir. Sınıfta, bir nesnenin barındırabileceği veri türleri ve nesnenin sergileyebileceği davranışlar hakkında bilgiler yer alır. Böyle bir soyutlamanın faydası, yalnızca birbiriyle etkileşim kuran birkaç nesnenin yer aldığı küçük komut dosyaları yazdığınızda belirgin olmayabilir. Ancak, programın kapsamı genişledikçe yönetilmesi gereken nesnelerin sayısı artar. Bu durumda sınıflar nesnelerin nasıl oluşturulduğunu ve birbirleriyle nasıl etkileşimde bulunduklarını daha rahat kontrol etmenize izin verir.

ActionScript 1.0'a kadar ActionScript programcıları, sınıflara benzeyen yapılar oluşturmak için Function nesnelerini kullanabilirdi. ActionScript 2.0 ise class ve extends gibi anahtar sözcüklerle sınıflar için biçimsel destek ekledi. ActionScript 3.0 ActionScript 2.0'daki anahtar sözcükleri desteklemekle kalmaz, aynı zamanda yeni özellikler de ekler: Örneğin, ActionScript 3.0 protected ve internal özellikleriyle geliştirilmiş erişim denetimi içerir. final ve override anahtar sözcükleriyle miras üzerinde de daha iyi denetim sağlar.

ActionScript, Java, C++, veya C# gibi programlama dillerinde sınıf oluşturmuş geliştiriciler için bilindik bir deneyim sağlar. ActionScript class , extends ve public gibi aynı özellik ve anahtar sözcüklerinin birçoğunu paylaşır.

Not: Adobe ActionScript belgesinde, özellik terimiyle değişkenler, sabitler ve yöntemler gibi herhangi bir nesne veya sınıf üyesi ifade edilmektedir. Ayrıca sınıf ve statik terimleri sık sık birbirinin yerine kullanılsa da, burada bu terimler birbirinden farklı şekilde ele alınmıştır. Örneğin, burada “sınıfı özellikleri” deyimi, yalnızca statik üyeleri değil, bir sınıfın tüm üyelerini ifade etmek için kullanılmıştır.

Sınıf tanımları

ActionScript 3.0 sınıf tanımları, ActionScript 2.0 sınıf tanımlarında kullanılana benzer bir sözdizimi kullanır. Sınıf tanımının düzgün sözdizimi, ardından sınıf adının geldiği class anahtar sözcüğünü çağırır. Sınıf adından sonra da, küme parantezi ( {} ) içine alınmış sınıf gövdesi gelir. Örneğin, aşağıdaki kod, visible adında tek bir değişken içeren Shape adında bir sınıf oluşturur:

public class Shape 
{ 
    var visible:Boolean = true; 
}

Önemli sözdizimi değişikliklerinden biri, paket içindeki sınıf tanımlarında gerçekleşmiştir. ActionScript 2.0'da, bir sınıf bir paketin içindeyse, sınıf bildirimine paket adının da dahil edilmesi gerekir. package deyimini ilk defa sunan ActionScript 3.0'da, paket adının, sınıf bildirimine değil, paket bildirimine dahil edilmesi gerekir. Örneğin, aşağıdaki sınıf bildirimleri, flash.display paketinin bir parçası olan BitmapData sınıfının ActionScript 2.0 ve ActionScript 3.0'da nasıl tanımlandığını gösterir:

// ActionScript 2.0 
class flash.display.BitmapData {} 
 
// ActionScript 3.0 
package flash.display 
{ 
    public class BitmapData {} 
}

Sınıf nitelikleri

ActionScript 3.0, aşağıdaki dört nitelikten birini kullanarak sınıf tanımlarını değiştirmenize olanak sağlar:

Nitelik

Tanım

dynamic

Çalışma zamanında örneklere özellik eklenmesine olanak sağlar.

final

Başka bir sınıf tarafından genişletilmemelidir.

internal (varsayılan)

Geçerli paketin içindeki başvurular tarafından görülebilir.

public

Her yerdeki başvurular tarafından görülebilir

internal dışında bu niteliklerin her biri için, ilişkilendirilmiş davranışı elde etmek üzere açıkça niteliği dahil etmeniz gerekir. Örneğin, bir sınıfı tanımlarken dynamic niteliğini dahil etmezseniz, çalışma zamanında sınıfa özellikler ekleyemezsiniz. Aşağıdaki kodun gösterdiği gibi, sınıf tanımının başına niteliği yerleştirerek açıkça o niteliği atamış olursunuz:

dynamic class Shape {}

Listede abstract adında bir nitelik bulunmadığına dikkat edin. Abstract sınıfları ActionScript 3.0'da desteklenmez. Ayrıca listede private ve protected adındaki niteliklerin de bulunmadığına dikkat edin. Bu nitelikler yalnızca bir sınıf tanımı içinde anlam içerir ve tek başlarına sınıflara uygulanamaz. Bir sınıfın paket dışında herkes tarafından görülebilir olmasını istemiyorsanız, sınıfı bir paketin içine yerleştirin ve internal niteliğiyle işaretleyin. Alternatif olarak, hem internal hem de public niteliklerini çıkarabilirsiniz, böylece derleyici internal niteliğini otomatik olarak sizin için ekler. Ayrıca bir sınıfı, yalnızca tanımlandığı kaynak dosyası içinde görünür olacak şekilde tanımlayabilirsiniz. Sınıfı, paket tanımının kapatma küme parantezinin altına, kaynak dosyanızın alt tarafına yerleştirin.

Sınıf gövdesi

Sınıf gövdesi küme parantezlerinin arasında kalır. Sınıfınızın değişkenlerini, sabitlerini ve yöntemlerini tanımlar. Aşağıdaki örnek ActionScript 3.0'daki Accessibility sınıfına ilişkin bildirimi gösterir:

public final class Accessibility 
{ 
    public static function get active():Boolean; 
    public static function updateProperties():void; 
}

Bir sınıf gövdesinin içinde bir ad alanını da tanımlayabilirsiniz. Aşağıdaki örnek, bir ad alanının, nasıl sınıf gövdesi içinde tanımlanabildiğini ve o sınıftaki yöntemin bir niteliği olarak kullanılabildiğini gösterir:

public class SampleClass 
{ 
    public namespace sampleNamespace; 
    sampleNamespace function doSomething():void; 
}

ActionScript 3.0, tanımları yalnızca sınıf gövdesine değil, deyimlere de dahil etmenize olanak sağlar. Sınıf gövdesinin içinde olup yöntem tanımının dışında olan deyimler, yalnızca bir kez çalıştırılır. Bu çalıştırma, sınıf tanımıyla ilk karşılaşıldığında ve ilişkili sınıf nesnesi oluşturulduğunda gerçekleşir. Aşağıdaki örnek, hello() adındaki bir harici işleve yapılan çağrıyı ve sınıf tanımlandığında onaylama mesajı veren bir trace deyimini içerir:

function hello():String 
{ 
    trace("hola"); 
} 
class SampleClass 
{ 
    hello(); 
    trace("class created"); 
} 
// output when class is created 
hola 
class created

ActionScript 3.0'da, aynı sınıf gövdesinde aynı ada sahip bir statik özelliğin ve örnek özelliğinin tanımlanmasına izin verilir. Örneğin, aşağıdaki kod, message adında bir statik değişkeni ve aynı ada sahip bir örnek değişkenini bildirir:

class StaticTest 
{ 
    static var message:String = "static variable"; 
    var message:String = "instance variable"; 
} 
// In your script 
var myST:StaticTest = new StaticTest(); 
trace(StaticTest.message); // output: static variable 
trace(myST.message); // output: instance variable

Sınıf özelliği nitelikleri

ActionScript nesne modeli ele alınırken, property terimi, değişkenler, sabitler ve yöntemler gibi, sınıf öğesi olabilen herhangi bir şeyi ifade eder. Ancak, Adobe Flash Platform'a ilişkin Adobe ActionScript 3.0 Referansı'nda bu terim daha az kullanılır. Bu bağlamda özellik terimi yalnızca değişken olan veya alıcı ya da ayarlayıcı yöntemiyle tanımlanan sınıf üyelerini içerir. ActionScript 3.0'da, bir sınıfın herhangi bir özelliğiyle kullanılan bir nitelik kümesi vardır. Aşağıdaki tabloda bu nitelik kümesi listelenmektedir.

Nitelik

Tanım

internal (varsayılan)

Aynı paketin içindeki başvurular tarafından görülebilir.

private

Aynı sınıftaki başvurular tarafından görülebilir.

protected

Aynı sınıftaki ve türetilmiş sınıflardaki başvurular tarafından görülebilir.

public

Her yerdeki başvurular tarafından görülebilir

static

Sınıf örneklerinin aksine, bir özelliğin bir sınıfa ait olduğunu belirtir.

UserDefinedNamespace

Kullanıcı tarafından tanımlanmış özel ad alanı adı

Erişim denetimi ad alanı nitelikleri

ActionScript 3.0, bir sınıf içinde tanımlanmış özelliklere erişimi denetleyen dört özel nitelik sağlar: public , private , protected ve internal .

public niteliği, bir özelliği komut dosyanızın her yerinde görülebilir duruma getirir. Örneğin, bir yöntemi kendi paketinin dışındaki kodlar için kullanılabilir duruma getirmek üzere, yöntemi public niteliğiyle bildirmeniz gerekir. var , const veya function anahtar sözcükleriyle bildirilmiş tüm özellikler için bu geçerlidir.

private niteliği, bir özelliğin yalnızca özelliğin tanımlayan sınıfı içindeki çağıranlar tarafından görülebilmesini sağlar. Bu davranış, alt sınıfın bir üst sınıftaki özel özelliğine erişmesine olanak sağlayan, ActionScript 2.0'daki private niteliğinin davranışından farklıdır. Davranıştaki başka bir önemli değişiklik de çalışma zamanı erişimiyle ilgilidir. ActionScript 2.0'da, private anahtar sözcüğü yalnızca derleme zamanında erişimi yasaklarken çalışma zamanında kolayca atlatılabilirdi. ActionScript 3.0'da ise artık bu durum geçerli değildir. private olarak işaretlenmiş özellikler, derleme zamanında da çalışma zamanında da kullanılamaz.

Örneğin, aşağıdaki kod, tek bir değişkenle PrivateExample adında basit bir sınıf oluşturur ve sonra sınıfın dışından özel değişkene erişmeyi dener.

class PrivateExample 
{ 
    private var privVar:String = "private variable"; 
} 
 
var myExample:PrivateExample = new PrivateExample(); 
trace(myExample.privVar);// compile-time error in strict mode 
trace(myExample["privVar"]); // ActionScript 2.0 allows access, but in ActionScript 3.0, this is a run-time error. 

ActionScript 3.0'da ise, katı mod kullanıyorsanız, nokta operatörü ( myExample.privVar ) kullanılarak bir özel özelliğe erişme girişimi, derleme zamanı hatasına yol açar. Aksi takdirde, özellik erişimi operatörü ( myExample["privVar"] ) kullandığınızda olduğu gibi, çalışma zamanında hata bildirilir.

Aşağıdaki tabloda, mühürlenmiş (dinamik olmayan) bir sınıfa ait özel özelliğe erişme girişiminin sonuçları özetlenmektedir:

Katı mod

Standart mod

nokta operatörü ( . )

derleme zamanı hatası

çalışma zamanı hatası

ayraç operatörü ( [] )

çalışma zamanı hatası

çalışma zamanı hatası

dynamic niteliğiyle bildirilen sınıflarda, özel bir değişkene erişme girişimi, çalışma zamanı hatasına yol açmaz. Bunun yerine, değişken görünür değildir, bu yüzden undefined değeri geri döndürülür. Ancak katı modda nokta operatörünü kullanırsanız derleme zamanı hatası oluşur. Aşağıdaki örnek, önceki örnekle aynıdır; tek farkı, PrivateExample sınıfının bir dinamik sınıf olarak bildirilmesidir:

dynamic class PrivateExample 
{ 
    private var privVar:String = "private variable"; 
} 
 
var myExample:PrivateExample = new PrivateExample(); 
trace(myExample.privVar);// compile-time error in strict mode 
trace(myExample["privVar"]); // output: undefined

Dinamik sınıflar genellikle, bir sınıf için harici olan bir kod, özel bir özelliğe erişme girişiminde bulunduğunda hata oluşturmak yerine undefined değerini döndürür. Aşağıdaki tabloda, yalnızca katı modda özel bir özelliğe erişmek için nokta operatörü kullanıldığında bir hata oluşturulduğu gösterilir:

Katı mod

Standart mod

nokta operatörü ( . )

derleme zamanı hatası

undefined

ayraç operatörü ( [] )

undefined

undefined

ActionScript 3.0'da ilk defa sunulan protected niteliği, bir özelliği kendi sınıfı veya alt sınıfı içindeki çağıranlar tarafından görülebilir duruma getirir. Başka bir deyişle, protected özelliği kendi sınıfı içinde kullanılabilir veya miras hiyerarşisinde kendisinin aşağısında bulunan sınıflar için kullanılabilir durumdadır. Alt sınıf aynı pakette veya farklı bir pakette de olsa bu durum geçerlidir.

ActionSctipt 2.0'ı bilenler için bu işlevsellik, ActionScript 2.0'daki private niteliğine benzerdir. ActionScript 3.0 protected niteliği de Java'daki protected niteliğine benzerdir. Java sürümünün ayrıca aynı paket içindeki çağıranlara izin vermesi açısından fark gösterir. protected niteliği, alt sınıfınız için gerekli olan ancak miras zincirinin dışındaki kodlardan gizlemek istediğiniz bir değişken veya yönteminiz olduğunda kullanışlıdır.

ActionScript 3.0'da yeni olan internal niteliği, bir özelliğin kendi paketi içindeki çağıranlar tarafından görülebilir olmasını sağlar. Bu, bir paket içindeki kod için varsayılan nitelik olup aşağıdaki niteliklerden herhangi birine sahip olmayan tüm özellikler için geçerlidir:

  • public

  • private

  • protected

  • kullanıcı tanımlı bir ad alanı

Java'da bu erişim düzeyi için açıkça bir ad olmayıp yalnızca başka bir erişim değiştiricisinin çıkarılmasıyla bu erişim düzeyi elde edilebilse de, internal niteliği, Java'daki varsayılan erişim denetimine benzer. internal niteliği, özelliği yalnızca kendi paketi içindeki çağıranlar tarafından görülebilir duruma getirme amacınızı açıkça belirtme seçeneğini size sunar.

static niteliği

var , const veya function anahtar sözcükleriyle bildirilmiş özelliklerle kullanılabilen static niteliği, bir özelliği sınıfın örneklerine değil, sınıfa eklemenize olanak sağlar. Sınıf için harici olan kodun, örnek adı yerine sınıf adını kullanarak statik özellikleri çağırması gerekir.

Statik özellikler alt sınıflar tarafından miras alınmaz ancak özellikler, alt sınıfın kapsam zincirinin parçasıdır. Başka bir deyişle, alt sınıfın gövdesi içinde, statik bir değişken veya yöntem tanımlanmış olduğu sınıfa başvurulmadan kullanılabilir.

Kullanıcı tanımlı ad alanı nitelikleri

Önceden tanımlanmış erişim denetimi niteliklerine alternatif olarak, bir nitelik olarak kullanılmak üzere özel bir ad alanı oluşturabilirsiniz. Her tanım için yalnızca bir ad alanı niteliği kullanılabilir ve ad alanı niteliğini, erişim denetimi niteliklerinden herhangi biriyle ( public , private , protected , internal ) birlikte kullanamazsınız.

Değişkenler

Değişkenler, var veya const anahtar sözcükleriyle bildirilebilir. var anahtar sözcüğüyle bildirilmiş değişkenlerin değerleri, komut dosyasının çalıştırılması sırasında birden çok defa değişebilir const anahtar sözcükleriyle bildirilen değişkenler sabitler olarak adlandırılır ve kendilerine yalnızca bir defa atanmış değerlere sahip olabilir. Başlatılmış bir sabite yeni bir değer atama girişimi hataya yol açar.

Statik değişkenler

Statik değişkenler, static anahtar sözcüğü ile var veya const deyiminin birleşimi kullanılarak bildirilir. Bir sınıf örneğine değil, sınıfa eklenen statik değişkenler, nesne sınıfının tamamı için geçerli olan bilgilerin saklanıp paylaşılmasında kullanışlıdır. Örneğin, bir sınıfın başlatılma sayısının hesabını tutmak istiyorsanız veya izin verilen maksimum sınıf örneği sayısını saklamak istiyorsanız statik değişken uygundur.

Aşağıdaki örnek, sınıf başlatma sayısının izlenmesi için totalCount değişkenini ve maksimum başlatma sayısını saklamak için MAX_NUM sabitini oluşturur. totalCount ve MAX_NUM değişkenleri, belirli bir örneğe değil, bir bütün olarak sınıfa uygulanan değerleri içerdiğinden statiktir.

class StaticVars 
{ 
    public static var totalCount:int = 0; 
    public static const MAX_NUM:uint = 16; 
}

StaticVars sınıfına ve bu sınıfın alt sınıflarına harici olan kod, yalnızca sınıfın kendisi üzerinden totalCount ve MAX_NUM özelliklerine başvurabilir. Örneğin, aşağıdaki kod çalışır:

trace(StaticVars.totalCount); // output: 0 
trace(StaticVars.MAX_NUM); // output: 16

Sınıfın bir örneği üzerinden statik değişkenlere erişemezsiniz, bu nedenle de aşağıdaki kod hata döndürür:

var myStaticVars:StaticVars = new StaticVars(); 
trace(myStaticVars.totalCount); // error 
trace(myStaticVars.MAX_NUM); // error

StaticVars sınıfının MAX_NUM için yaptığı gibi, hem static hem de const anahtar sözcükleriyle bildirilen değişkenlerin, siz sabiti bildirdiğiniz anda başlatılması gerekir. Yapıcı veya bir örnek yöntemi içinde MAX_NUM öğesine bir değer atayamazsınız. Aşağıdaki kod, statik sabit başlatmanın geçerli bir yolu olmadığından bir hata oluşturur:

// !! Error to initialize static constant this way 
class StaticVars2 
{ 
    public static const UNIQUESORT:uint; 
    function initializeStatic():void 
    { 
        UNIQUESORT = 16; 
    } 
}

Örnek değişkenleri

Örnek değişkenleri arasında, var ve const anahtar sözcükleri ile ancak static anahtar sözcüğü olmadan bildirilen özellikler yer alır. Sınıfın tamamı yerine sınıf örneklerine eklenen örnek değişkenler, bir örneğe özgü değerlerin saklanmasında kullanışlıdır. Örneğin, Array sınıfı, belirli bir Array sınıfının barındırdığı dizi öğelerinin sayısını saklayan length adında bir örnek özelliğine sahiptir.

var veya const olarak bildirilen örnek değişkenleri, bir alt sınıfta geçersiz kılınamaz. Ancak, alıcı ve ayarlayıcı yöntemlerini geçersiz kılarak değişkenlerin geçersiz kılınmasına benzer işlevselliği gerçekleştirebilirsiniz.

Yöntemler

Yöntemler, bir sınıf tanımının parçası olan işlevlerdir. Sınıfın bir örneği oluşturulduktan sonra, bir yöntem bu örneğe bağımlı olur. Sınıf dışında bildirilen bir işlevden farklı olarak yöntem, eklendiği örnekten ayrı şekilde kullanılamaz.

Yöntemler, function anahtar sözcüğü kullanılarak tanımlanır. Herhangi bir sınıf özelliğiyle, özel, korunan, genel, dahili, statik veya özel ad alanını da içeren sınıf özelliği niteliklerinden herhangi birini yöntemlere uygulayabilirsiniz. Bir işlev deneyimini aşağıdaki gibi kullanabilirsiniz:

public function sampleFunction():String {}

Veya aşağıdaki gibi bir işlev ifadesi atadığınız bir değişkeni kullanabilirsiniz:

public var sampleFunction:Function = function () {}

Çoğu durumda, aşağıdaki nedenlerden dolayı işlev ifadesi yerine işlev deyimi kullanın:

  • İşlev deyimleri daha kısa ve okunması daha kolaydır.

  • İşlev deyimleri, override ve final anahtar sözcüklerini kullanmanıza olanak sağlar.

  • İşlev deyimleri, tanımlayıcı (işlevin adı) ile yöntem gövdesinin içindeki kod arasında daha güçlü bir bağ oluşturur. Değişkenin değeri bir atama deyimiyle değiştirilebildiğinden, değişken ile işlev ifadesi arasındaki bağlantı herhangi bir zamanda kesilebilir. Değişkeni var yerine const ile bildirerek bu sorunu geçici olarak çözebilseniz de, bu teknik, en iyi uygulama olarak değerlendirilmez. Kodun okunmasını güçleştirip override ve final anahtar sözcüklerinin kullanılmasını önler.

Prototip nesnesine bir işlev eklemeyi seçtiğinizde işlev ifadesi kullanmanız gerekir.

Yapıcı yöntemleri

Bazen yapıcılar olarak da adlandırılan yapıcı yöntemleri, tanımlandıkları sınıfla aynı adı paylaşan işlevlerdir. new anahtar sözcüğüyle sınıfın bir örneği her oluşturulduğunda, yapıcı yöntemine dahil ettiğiniz kodlar çalıştırılır. Örneğin, aşağıdaki kod, status adında tek bir özellik içeren Example adında basit bir sınıfı tanımlar. status değişkeninin başlangıç değeri, yapıcı işlevinin içinde ayarlanır.

class Example 
{ 
    public var status:String; 
    public function Example() 
    { 
        status = "initialized"; 
    } 
} 
 
var myExample:Example = new Example(); 
trace(myExample.status); // output: initialized

Yapıcı yöntemleri yalnızca genel olabilir ancak public niteliğinin kullanılması isteğe bağlıdır Bir yapıcıda private , protected veya internal gibi diğer erişim denetimi belirticilerinden herhangi birini kullanamazsınız. Ayrıca yapıcı yöntemiyle kullanıcı tanımlı bir ad alanı da kullanamazsınız.

Yapıcı, super() deyimini kullanarak doğrudan üst sınıfının yapıcısına açıkça bir çağrı yapabilir. Üst sınıf yapıcısı açıkça çağrılmazsa, derleyici otomatik olarak yapıcı gövdesindeki birinci deyimin önüne bir çağrı ekler. Üst sınıfın başvurusu olarak super önekini kullanarak da üst sınıf yöntemlerini çağırabilirsiniz. Aynı yapıcı gövdesinde hem super() hem de super öğesini kullanmaya karar verirseniz, ilk olarak super() öğesini çağırdığınızdan emin olun. Aksi takdirde, super başvurusu beklendiği gibi davranmaz. super() yapıcısının ayrıca throw veya return deyiminden önce çağrılması gerekir.

Aşağıdaki örnek, super() yapıcısını çağırmadan önce super başvurusunu kullanmaya çalışmanız durumunda ne olacağını gösterir. Yeni bir sınıf olan ExampleEx, Example sınıfını genişletir. ExampleEx yapıcısı, üst sınıfında tanımlanmış durum değişkenine erişmeye çalışır ancak bunu super() öğesini çağırmadan önce yapar. super() yapıcısı çalıştırılıncaya kadar status değişkeni kullanılamadığından, ExampleEx yapıcısının içindeki trace() deyimi, null değerini üretir.

class ExampleEx extends Example 
{ 
    public function ExampleEx() 
    { 
        trace(super.status); 
        super(); 
    } 
} 
 
var mySample:ExampleEx = new ExampleEx(); // output: null

Yapıcı içinde return deyiminin kullanılması geçerli bir durum olsa da, bir değer döndürülmesine izin verilmez. Başka bir deyişle, return deyimlerinin ilişkilendirilmiş ifadeler veya değerler içermemesi gerekir. Aynı şekilde, yapıcı yöntemlerinin değer döndürmesine izin verilmez, başka bir deyişle, herhangi bir döndürme türü belirtilemez.

Sınıfınızda bir yapıcı yöntemi tanımlamazsanız, derleyici otomatik olarak sizin için boş bir yapıcı oluşturur. Sınıfınız başka bir sınıfı genişletirse, derleyici oluşturduğu yapıcıya bir super() çağrısı ekler.

Statik yöntemler

Sınıf yöntemleri olarak da adlandırılan statik yöntemler, static anahtar sözcüğüyle bildirilen yöntemlerdir. Sınıfın örneğine değil, sınıfa eklenen statik yöntemler, tek bir örneğin durumu dışındaki şeyleri etkileyen işlevlerin kapsüllenmesinde kullanışlıdır. Statik yöntemler bir bütün olarak sınıfa eklendiğinden, statik yöntemlere sınıfın örneği üzerinden değil yalnızca sınıf üzerinden erişilebilir.

Statik yöntemler, sınıf örneklerinin durumunu etkilemekle sınırlı olmayan işlevlerin kapsüllenmesinde kullanışlıdır. Başka bir deyişle, bir yöntem sınıf örneğinin değerini doğrudan etkilemeyen işlevler sağlıyorsa statik olmalıdır. Örneğin, Date sınıfı, bir dizeyi alıp sayıya dönüştüren parse() adındaki bir statik yönteme sahiptir. Bu yöntem sınıfın tek bir örneğini etkilemediğinden statiktir. parse() yöntemi bir tarih değerini temsil eden dizeyi alır, dizeyi ayrıştırır ve Date nesnesinin dahili temsiliyle uyumlu bir biçimde sayıyı döndürür. Date sınıfının bir örneğine yöntemin uygulanması mantıklı olmadığından, bu yöntem bir örnek yöntemi değildir.

Statik parse() yöntemini, getMonth() gibi Date sınıfının örnek yöntemlerinden biriyle karşılaştırın. getMonth() yöntemi, Date örneğinin belirli bir bileşenini (ay) alarak doğrudan örneğin değeri üzerinde çalıştığından, bir örnek yöntemidir.

Statik yöntemler tek tek örneklere bağımlı olmadığından, statik yöntemin gövdesinde this veya super anahtar sözcüklerini kullanamazsınız. this başvurusu ve super başvurusu yalnızca bir örnek yönteminin bağlamında anlam içerir.

Bazı sınıf tabanlı programlama dillerinin aksine, ActionScript 3.0'da statik yöntemler miras alınmaz.

Örnek yöntemleri

Örnek yöntemleri, static anahtar sözcüğü olmadan bildirilen yöntemlerdir. Bütün olarak sınıfa değil, sınıfın örneklerine eklenen örnek yöntemleri, sınıfın tek tek örneklerini etkileyen işlevlerin uygulanmasında kullanışlıdır. Örneğin, Array sınıfı, doğrudan Array örneklerinde çalışan sort() adında bir örnek yöntemi içerir.

Örnek yönteminin gövdesinde statik değişkenler ve örnek değişkenleri kapsam içinde bulunur, başka bir deyişle, aynı sınıfta tanımlanmış değişkenlere, basit bir tanımlayıcı kullanılarak başvurulabilir. Örneğin, şu sınıf (CustomArray) Array sınıfını genişletir. CustomArray sınıfı, sınıf örneklerinin toplam sayısını izlemek için arrayCountTotal adındaki bir statik değişkeni, örneklerin oluşturulma sırasını izleyen arrayNumber adındaki bir örnek değişkenini ve bu değişkenlerin değerlerini döndüren getPosition() adındaki bir örnek yöntemini tanımlar.

public class CustomArray extends Array 
{ 
    public static var arrayCountTotal:int = 0; 
    public var arrayNumber:int; 
 
    public function CustomArray() 
    { 
        arrayNumber = ++arrayCountTotal; 
    } 
     
    public function getArrayPosition():String 
    { 
         return ("Array " + arrayNumber + " of " + arrayCountTotal); 
    } 
}

Sınıfa harici olan kodun CustomArray.arrayCountTotal öğesini kullanarak sınıf nesnesi üzerinden arrayCountTotal statik değişkenine erişmesi gerekse de, getPosition() yönteminin gövdesinde bulunan kod, doğrudan arrayCountTotal değişkenini ifade edebilir. Üst sınıflardaki statik değişkenler için de bu geçerlidir. Statik özellikler ActionScript 3.0'da miras alınmasa da, üst sınıflardaki statik özellikler kapsam içindedir. Örneğin, Array sınıfı, bir tanesi DESCENDING olarak adlandırılan birkaç statik değişkene sahiptir. Array alt sınıfında bulunan kod, basit bir tanımlayıcı kullanarak DESCENDING statik sabitine erişebilir:

public class CustomArray extends Array 
{ 
    public function testStatic():void 
    { 
        trace(DESCENDING); // output: 2 
    } 
}

Bir örnek yönteminin gövdesindeki this başvurusunun değeri, yöntemin eklendiği örneğin başvurusudur. Aşağıdaki kod, this başvurusunun yöntemi içeren örneği işaret ettiğini gösterir:

class ThisTest 
{ 
    function thisValue():ThisTest 
    { 
        return this; 
    } 
} 
 
var myTest:ThisTest = new ThisTest(); 
trace(myTest.thisValue() == myTest); // output: true

Örnek yöntemlerinin mirası, override ve final anahtar sözcükleriyle denetlenebilir. Miras alınan bir yöntemi yeniden tanımlamak için override niteliğini ve alt sınıfların bir yöntemi geçersiz kılmasını önlemek için final niteliğini kullanabilirsiniz.

Erişimci yöntemlerini alma ve ayarlama

Alıcılar ve ayarlayıcılar olarak da adlandırılan alma ve ayarlama erişimci işlevleri, oluşturduğunuz sınıflar için kullanımı kolay bir programlama arabirimi sağlarken, bilgi gizleme ve kapsüllemeye yönelik programlama ilkelerine da bağlı kalmanıza olanak sağlar. Alma ve ayarlama işlevleri, sınıf özelliklerinizin sınıf için özel olmasını sürdürmenizi ancak sınıfınızın kullanıcılarının bir sınıf yöntemi çağırmak yerine bir sınıf değişkenine erişiyormuş gibi bu özelliklere erişmesine olanak sağlar.

Bu yaklaşımın avantajı, getPropertyName() ve setPropertyName() gibi kullanılması güç adlara sahip geleneksel erişimci işlevlerinden kaçınmanıza olanak sağlamasıdır. Alıcı ve ayarlayıcıların başka bir avantajı da, hem okuma hem de yazma erişimine izin veren her özellik için genele açık iki işlevden kaçınabilmenizi sağlamasıdır.

GetSet adındaki şu örnek sınıf, privateProperty adındaki özel değişkene erişim sağlayan publicAccess() adında alma ve ayarlama erişimci işlevlerini içerir:

class GetSet 
{ 
    private var privateProperty:String; 
     
    public function get publicAccess():String 
    { 
        return privateProperty; 
    } 
     
    public function set publicAccess(setValue:String):void 
    { 
        privateProperty = setValue; 
    } 
}

privateProperty özelliğine doğrudan erişmeyi denerseniz, aşağıdaki gibi bir hata oluşur:

var myGetSet:GetSet = new GetSet(); 
trace(myGetSet.privateProperty); // error occurs

Bunun yerine, GetSet sınıfının kullanıcısı, publicAccess adında bir özellik olarak görünen ancak gerçekte privateProperty adındaki özel özellikte çalışan bir alma ve ayarlama erişimcisi işlevleri çifti olan bir öğeyi kullanır. Aşağıdaki örnek, GetSet sınıfını başlatır ve sonra publicAccess adındaki genel erişimciyi kullanarak privateProperty değerini ayarlar:

var myGetSet:GetSet = new GetSet(); 
trace(myGetSet.publicAccess); // output: null 
myGetSet.publicAccess = "hello"; 
trace(myGetSet.publicAccess); // output: hello

Alıcı ve ayarlayıcı işlevleri, normal sınıf üyesi değişkenleri kullandığınız zaman mümkün olmayacak şekilde, bir üst sınıftan miras alınan özellikleri geçersiz kılmanıza olanak sağlar. var anahtar sözcüğü kullanılarak bildirilen sınıf üyesi değişkenleri, bir alt sınıfta geçersiz kılınamaz. Alıcı ve ayarlayıcı işlevleri kullanılarak oluşturulan özelliklerse bu kısıtlamaya sahip değildir. Bir üst sınıftan miras alınan alıcı ve ayarlayıcı işlevlerinde override niteliğini kullanabilirsiniz.

Bağımlı yöntemler

Bazen yöntem kapanışı olarak da adlandırılan bir bağımlı yöntem, yalnızca örneğinden ayıklanmış bir yöntemdir. Bağımlı yöntem örnekleri arasında, bir işleve argüman olarak iletilen veya bir işlevden değer olarak döndürülen yöntemler yer alır. ActionScript 3.0'da yeni bir özellik olan bağımlı yöntem, kendi örneğinden ayıklandığında da sözlü ortamını koruduğundan bir işlev kapanışına benzer. Bağımlı yöntem ile işlev kapanışı arasındaki en önemli fark, bağımlı yöntemin this başvurusunun, yöntemi uygulayan örneğe bağlı veya bağımlı kalmaya devam etmesidir. Başka bir deyişle, bağımlı yöntemdeki this başvurusu her zaman yöntemi uygulayan orijinal nesneyi işaret eder. İşlev kapanışları için, this başvurusu geneldir, başka bir deyişle, çağrıldığı zaman işlevin ilişkilendirilmiş olduğu nesneyi işaret eder.

this anahtar sözcüğünü kullanıyorsanız, bağımlı yöntemleri anlamanız önemlidir. this anahtar sözcüğünün yöntemin üst nesnesine bir başvuru sağladığını unutmayın. ActionScript programcılarının çoğu, this anahtar sözcüğünün her zaman yöntemin tanımını içeren nesneyi veya sınıfı temsil etmesini bekler. Ancak yöntem bağlama olmadan bu her zaman geçerli olmayabilir. Örneğin, önceki ActionScript sürümlerinde this başvurusu her zaman yöntemi uygulayan örneği ifade etmiyordu. ActionScript 2.0'da bir örnekten yöntemler ayıklandığında, this başvurusu orijinal örneğe bağımlı olmamakla kalmaz aynı zamanda örneğin sınıfının üye değişkenleri ve yöntemleri de kullanılamaz. Bir yöntemi parametre olarak ilettiğinizde bağımlı yöntemler otomatik olarak oluşturulduğundan ActionScript 3.0'da bu bir sorun yaratmaz. Bağımlı yöntemler, this anahtar sözcüğünün her zaman yöntemin tanımlanmış olduğu nesne veya sınıfa başvurmasını sağlar.

Aşağıdaki kod, bağımlı yöntemi tanımlayan foo() adındaki bir yöntemi ve bağımlı yöntemi döndüren bar() adındaki bir yöntemi içeren ThisTest adındaki bir sınıfı tanımlar. Sınıfa harici olan kod, ThisTest sınıfının bir örneğini oluşturur, bar() yöntemini çağırır ve döndürme değerini myFunc adındaki bir değişkende saklar.

class ThisTest 
{ 
    private var num:Number = 3; 
    function foo():void // bound method defined 
    { 
        trace("foo's this: " + this); 
        trace("num: " + num); 
    } 
    function bar():Function 
    { 
        return foo; // bound method returned 
    } 
} 
 
var myTest:ThisTest = new ThisTest(); 
var myFunc:Function = myTest.bar(); 
trace(this); // output: [object global] 
myFunc(); 
/* output:  
foo's this: [object ThisTest] 
output: num: 3 */

Kodun son iki satırı, kendisinden bir önceki satırsa bulunan this başvurusu genel nesneyi işaret etse de, foo() bağımlı yöntemindeki this başvurusunun halen ThisTest sınıfının bir örneğini işaret ettiğini gösterir. Üstelik, myFunc değişkeninde saklanan bağımlı yöntem, ThisTest sınıfının üye değişkenlerine erişmeye devam eder. Bu kodun aynısı ActionScript 2.0'da çalıştırılsa, this başvuruları eşleşir ve num değişkeni undefined olurdu.

addEventListener() yöntemi, argüman olarak bir işlev veya yöntem iletmenizi gerektirdiğinden, bağımlı yöntemlerin eklenmesinin en belirgin olduğu alanlardan biri olay işleyicileridir.

Sınıflarla numaralandırma

Numaralandırmalar , küçük bir değer kümesini kapsüllemek için oluşturduğunuz özel veri türleridir. ActionScript 3.0, enum anahtar sözcüğüne sahip C++ veya Numaralandırma arabirimine sahip Java uygulamalarından farklı olarak belirli bir numaralandırma hizmetini desteklemez. Ancak sınıfları ve statik sabitleri kullanarak numaralandırmalar oluşturabilirsiniz. Örneğin, ActionScript 3.0'daki PrintJob sınıfı, aşağıdaki kodda gösterildiği gibi, "landscape" ve "portrait" değerlerini saklamak için PrintJobOrientation adında bir numaralandırma kullanır:

public final class PrintJobOrientation 
{ 
    public static const LANDSCAPE:String = "landscape"; 
    public static const PORTRAIT:String = "portrait"; 
}

Kural gereği, sınıfı genişletmeye gerek olmadığından, numaralandırma sınıfı final niteliğiyle bildirilir. Sınıf yalnızca statik üyeleri içerir, başka bir deyişle, sınıfın örneklerini oluşturmazsınız. Bunun yerine, aşağıdaki kod alıntısında gösterildiği gibi, doğrudan sınıf nesnesi üzerinden numaralandırma değerlerine erişirsiniz:

var pj:PrintJob = new PrintJob(); 
if(pj.start()) 
{ 
    if (pj.orientation == PrintJobOrientation.PORTRAIT) 
    { 
        ... 
    } 
    ... 
}

ActionScript 3.0'daki numaralandırma sınıflarının tümü yalnızca String, int veya uint türündeki değişkenleri içerir. Değişmez dizeler veya sayı değerleri yerine numaralandırmaları kullanmanın avantajı, yazım hatalarının numaralandırmada daha kolay bulunabilmesidir. Bir numaralandırmanın adını yanlış yazarsanız, ActionScript derleyicisi bir hata oluşturur. Değişmez değerleri kullanırsanız, bir sözcüğü yanlış yazdığınızda veya yanlış sayıyı kullandığınızda derleyici şikayette bulunmaz. Önceki örnekte, aşağıdaki alıntının gösterdiği gibi, numaralandırma sabitinin adı hatalıysa, derleyici bir hata oluşturur:

    if (pj.orientation == PrintJobOrientation.PORTRAI) // compiler error

Ancak, aşağıdaki gibi, bir dize değişmez değerini yanlış yazarsanız, derleyici bir hata oluşturmaz:

    if (pj.orientation == "portrai") // no compiler error

Numaralandırma oluşturmaya yönelik ikinci bir teknik de, numaralandırma için statik özelliklere sahip ayrı bir sınıf oluşturulmasıdır. Ancak her statik özellik, bir dize veya tam sayı değerini değil, sınıfın bir örneğini içerdiğinden, bu teknik farklılık gösterir. Örneğin, aşağıdaki kod, haftanın günleri için bir numaralandırma sınıfı oluşturur:

public final class Day 
{ 
    public static const MONDAY:Day = new Day(); 
    public static const TUESDAY:Day = new Day(); 
    public static const WEDNESDAY:Day = new Day(); 
    public static const THURSDAY:Day = new Day(); 
    public static const FRIDAY:Day = new Day(); 
    public static const SATURDAY:Day = new Day(); 
    public static const SUNDAY:Day = new Day(); 
}

Bu teknik ActionScript 3.0 tarafından kullanılmasa da, tekniğin sağladığı gelişmiş tür denetlemesini tercih eden birçok geliştirici tarafından kullanılır. Örneğin, numaralandırma değeri döndüren bir yöntem, döndürme değerini numaralandırma veri türüyle sınırlandırabilir. Aşağıdaki kod, yalnızca haftanın gününü döndüren bir işlevi değil, aynı zamanda tür ek açıklaması olarak numaralandırma türünü kullanan bir işlev çağrısını da gösterir:

function getDay():Day 
{ 
    var date:Date = new Date(); 
    var retDay:Day; 
    switch (date.day) 
    { 
        case 0: 
            retDay = Day.MONDAY; 
            break; 
        case 1: 
            retDay = Day.TUESDAY; 
            break; 
        case 2: 
            retDay = Day.WEDNESDAY; 
            break; 
        case 3: 
            retDay = Day.THURSDAY; 
            break; 
        case 4: 
            retDay = Day.FRIDAY; 
            break; 
        case 5: 
            retDay = Day.SATURDAY; 
            break; 
        case 6: 
            retDay = Day.SUNDAY; 
            break; 
    } 
    return retDay; 
} 
 
var dayOfWeek:Day = getDay();

Ayrıca, haftanın günlerinin her biriyle bir tam sayıyı ilişkilendirip günün dize halinde temsilini döndüren bir toString() yöntemi sağlayacak şekilde Day sınıfını geliştirebilirsiniz.

Gömülü varlık sınıfları

ActionScript 3.0, gömülü varlıkları temsil etmek için gömülü varlık sınıfları adı verilen özel sınıfları kullanır. Gömülü varlık , derleme zamanında bir SWF dosyasına dahil edilen, ses, görüntü, font gibi bir varlıktır. Bir varlığın dinamik olarak yüklenmek yerine gömülmesi, o varlığın çalışma zamanında da kullanılabilir olmasını sağlarken SWF dosyasının boyutunun artmasına neden olur.

Flash Professional'da gömülü varlık sınıflarını kullanma

Bir varlığı gömmek için, ilk olarak varlığı bir FLA dosyasının kütüphanesine yerleştirin. Ardından varlığın gömülü varlık sınıfı için bir ad sağlamak üzere varlığın bağlantı özelliğini kullanın. Sınıf yolunda bu ada sahip bir sınıf bulunmazsa, sizin için otomatik olarak bir sınıf oluşturulur. Daha sonra, gömülü varlık sınıfının bir örneğini oluşturabilir ve o sınıf tarafından tanımlanmış veya miras alınmış özellikleri ve yöntemleri kullanabilirsiniz. Örneğin, aşağıdaki kod, PianoMusic adındaki gömülü bir varlık sınıfına bağlı gömülü bir sesi çalmak için kullanılabilir:

var piano:PianoMusic = new PianoMusic(); 
var sndChannel:SoundChannel = piano.play();

Alternatif olarak, [Embed] meta veri etiketini bir sonraki bölümde açıklandığı gibi, Flash Professional projesinde varlık gömmek için kullanabilirsiniz. [Embed] meta veri etiketini kodunuzda kullanırsanız, Flash Professional, projenizi derlemek için Flash Professional derleyicisi yerine Flex derleyicisi kullanır.

Flex derleyicisi kullanarak gömülü varlık sınıfları kullanma

Kodunuzu Flex derleyicisi kullanarak derliyorsanız, ActionScript kodunda bir varlık gömmek için [Embed] meta veri etiketini kullanın. Varlığı ana kaynak klasörüne veya projenizin oluşturma yolundaki başka bir klasöre yerleştirin. Flex derleyicisi bir Embed meta veri etiketiyle karşılaşırsa, sizin için gömülü varlık sınıfını oluşturur. [Embed] meta veri etiketinden hemen sonra bildirdiğiniz bir Class veri türündeki değişken üzerinden sınıfa erişebilirsiniz. Örneğin, aşağıdaki kod, sound1.mp3 adındaki bir sesi gömer ve o sesle ilişkilendirilmiş gömülü varlık sınıfının bir başvurusunu saklamak için soundCls adındaki bir değişkeni kullanır. Daha sonra örnek, gömülü varlık sınıfının bir örneğini oluşturur ve bu örnekte play() yöntemini çağırır:

package 
{ 
    import flash.display.Sprite; 
    import flash.media.SoundChannel; 
    import mx.core.SoundAsset; 
 
    public class SoundAssetExample extends Sprite 
    { 
        [Embed(source="sound1.mp3")] 
        public var soundCls:Class; 
         
        public function SoundAssetExample() 
        { 
            var mySound:SoundAsset = new soundCls() as SoundAsset; 
            var sndChannel:SoundChannel = mySound.play(); 
        } 
    } 
}

Adobe Flash Builder

Bir Flash Builder ActionScript projesinde [Embed] meta veri etiketini kullanmak için, Flex çerçevesinden gerekli sınıfları içe aktarın. Örneğin, sesleri gömmek için mx.core.SoundAsset sınıfını içe aktarın. Flex çerçevesini kullanmak için, ActionScript oluşturma yolunuza framework.swc dosyasını dahil edin. Bunun sonucunda SWF dosyanızın boyutu artar.

Adobe Flex

Alternatif olarak, Flex'te bir MXML etiket tanımında @Embed() direktifiyle bir varlığı gömebilirsiniz.