as3備忘十-類

在這裏寫一下備忘的原則,我認爲在as3中融合了java和javascript的特性,而我記錄的備忘點多數是和它們不同的地方。

 

1、可用於修飾類定義的四個屬性 ,默認是internal:

  • dynamic                允許在運行時向實例添加屬性。
  • final                      不得由其它類擴展。
  • internal (默認)    對當前包內的引用可見。
  • public                     對所有位置的引用可見。

2、在as3中沒有抽象類,所以定義類時並沒有abstract關鍵字。

 

3、類中可以定義常量,變量,方法,還可以定義命名空間:

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

 

4、在as3中允許定義同名的靜態屬性和實例屬性。

 

class StaticTest
{
    static var message:String = "static variable";
    var message:String = "instance variable";
}
// 在腳本中
var myST:StaticTest = new StaticTest();
trace(StaticTest.message); // 輸出:靜態變量
trace(myST.message); // 輸出:實例變量

 

5、可用於類成員定義的屬性有:

  • internal (默認)     對同一包中的引用可見。
  • private                   對同一類中的引用可見。
  • protected               對同一類及派生類中的引用可見。
  • public                     對所有位置的引用可見。
  • static                     指定某一屬性屬於該類,而不屬於該類的實例。
  • UserDefinedNamespace              用戶定義的自定義命名空間名。


6、使用 dynamic 屬性聲明的類中嘗試訪問私有變量時,不會導致運行時錯誤。只是變量不可見。但如果用.點運算符訪問時,會在嚴格模式下出編譯錯誤,用屬性訪問符[]就不會。


7、類的構造函數方法只能是公共方法,但可以選擇性地使用 public 屬性。不能對構造函數使用任何其它訪問控制說明符(包括使用 private、protected 或 internal)。也不能對函數構造方法使用用戶定義的命名空間。


8、在as中有一個叫做set和get存取器的東西,其實它實現的功能類似於java中的bean,實現了對私有變量的存取,但在as3中的實現有所不同。

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

如果嘗試直接訪問屬性 privateProperty,將會發生錯誤,如下所示:

var myGetSet:GetSet = new GetSet();
trace(myGetSet.privateProperty); // 發生錯誤

但可以使用名爲 publicAccess 的公共存取器設置 privateProperty 的值:

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

 9、類的方法中this關鍵字始終引用該方法所屬的實例,這一點和javascript中有所不同,因爲as3實現了自動綁定。但函數和javascript中還是一樣。

class ThisTest
{
    private var num:Number = 3;
    function foo():void // 定義的綁定方法
    {
        trace("foo's this: " + this);
        trace("num: " + num);
    }
    function bar():Function
    {
        return foo; // 返回的綁定方法
    }
}

var myTest:ThisTest = new ThisTest();
var myFunc:Function = myTest.bar();
trace(this); // 輸出:[ 全局對象]
myFunc();
/* 輸出:
foo's this: [object ThisTest]
output: num: 3 */
 

 

10、在as3中接口只能包含方法但不能包含方法體。接口不能包含變量或常量,這些都和java一樣,但是可以包含 getter 和 setter

 

11、類在實現接口時,實現的方法的參數數和每個參數的數據類型必須與接口方法的參數數和數據類型相匹配,但參數名不需要匹配

 

12、實現具有默認值參數的接口方法時必須採用默認參數值 ,默認參數值是與接口定義中指定的值具有相同數據類型的一個成員,但是實際值不一定匹配

//接口
interface IGamma
{
    function doSomething(param:int = 3):void;
}

//實現類
class Gamma implements IGamma
{
    public function doSomething(param:int = 4):void {}//默認值和接口中不一樣
}

 13、在父類中使用 var 或 const 關鍵字聲明的屬性,繼承的子類是不能對其進行覆蓋的。覆蓋某一屬性就表示在子類中重新定義該屬性。唯一可覆蓋的屬性類型是方法,即使用 function 關鍵字聲明的屬性。雖然不能覆蓋實例變量,但是通過爲實例變量創建 getter 和 setter 方法並覆蓋這些方法

 

14、靜態方法不能繼承,也不能覆蓋。但是,實例方法可由子類繼承(final、private的除外),也可覆蓋

 

15、子類訪問父類的靜態屬性是不需要類名限定符的:

class Base {
    public static var test:String = "static";
}

class Extender extends Base
{
    public function Extender()
    {
        trace(test); // 輸出:靜態
    }
}

 

本方地址:http://kino.iteye.com/blog/239598 ,轉載請註明,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章