Flash AS學習:建構函式小結

來源:互聯網
上載者:User
函數

  一、建構函式的差別性

  建構函式是一個特殊的成員函數,與成員函數具有共同性和差別性。例如:建構函式與成員函數一樣,通過function關鍵字來定義,可以聲明為private或public,可以在建構函式中加入參數等。
一、建構函式的差別性主要體現在:
l    建構函式名與類名必須相同,並且區分大小寫;
l    建構函式不能聲明為static,它只能是private或public;
l    建構函式中不能使用return語句返回一個值;
l    建構函式不能返回指定的資料類型;
當違反以上規則時,flash會在輸出面板提示相應的資訊。
1、在下面的Load類我們定義一個成員函數load:

class Load { 
    function load() { 
    } 

進行語法檢查時,flash會提示以下的資訊:
成員函數“load”與定義的類的名稱“Load”大小寫不同,在運行時將被視為類建構函式。
2、如果我們在建構函式中聲明了static屬性:

class Load { 
    static function Load() { 
    } 

flash將提示:
允許用於建構函式的屬性只有 public 和 private
3、如果我們在建構函式中使用了return語句返回一個值:

class Load { 
    var i = 0; 
    function Load() { 
        return i; 
    } 

flash將提示:
建構函式不能傳回值
4、如果我們在建構函式中返回了一個資料類型:

class Load { 
    function Load():Load { 
    } 

flash將提示:
建構函式不能指定傳回型別

  二、建構函式的傳回值

  雖然在建構函式中不能用return返回一個值,但建構函式有傳回值,它返回的是為該類的執行個體。
如:

class Load { 
    function Load() { 
    } 
    function toString():String { 
        return "Load類的執行個體"; 
    } 

測試方法:

trace(new Load()); 

在輸出面板中輸出:
Load類的執行個體
在類中加入toString方法的原因:
當Load類的對象作為字串對待時,toString()方法會自動調用,這個方法在使用trace()調試類的屬性、執行個體等時非常有用,所以在有建構函式的類裡面,一般都配有toString()方法,位置放在建構函式的後面。
如果沒有toString()方法,測試結果可不是我們想要:
[object Object]
在建立類的執行個體時,一般都要指定一個執行個體名:
var t:Load = new Load();
以上的代碼的執行過程:
l    建立一個Load類的對象,並為該對象分配儲存空間。
l    調用Load類的建構函式,初始化這個建立的對象。
l    聲明一個Load類的執行個體的引用t即執行個體名,使其指向這個新的對象。
通過執行個體名就可以使用執行個體屬性和執行個體方法:
執行個體名.屬性
執行個體名.方法名()

  三、建構函式的參數傳遞

  當用建構函式創造類的執行個體時,常常要初始化一些類的屬性,這些屬性通常用建構函式的參數來傳遞。

class ToolTip {    
    private var _str:DrawString;    
    private var _shape:Shape;    
    public function ToolTip(str:DrawString, shape:Shape) {
        _str = str;
        _shape = shape;
    }
//設定和擷取屬性的代碼
}

  如果參數名與屬性名稱相同,可以使用this關鍵字來指向類的執行個體,通過點文法把參數傳遞進來:

class ToolTip {    
    private var str:DrawString;    
    private var shape:Shape;    
    public function ToolTip(str:DrawString, shape:Shape) {
        this.str = str;
        this.shape = shape;
    }
}

  使用:

var t:ToolTip=new ToolTip(str, rect);

  在建構函式的參數傳遞中,也存在著地址傳遞和數值傳遞的問題,這特別要引起注意。如下面兩個參數不同傳遞方式的例子:
  地址傳遞:

class Box {
    function Box(a:Array) {
        a[0] = 5;
        trace(a[0]);
    }
}
var a = ["1"];
var t:Box = new Box(a);
trace(a[0]);
//5
//5

  數值傳遞:

class Box { 
    function Box(a) { 
        a = 5; 
        trace(a); 
    } 

var a = 1 
var t:Box = new Box(a); 
trace(a); 
//5 
//1

  關於參數傳遞的原理可參考書
  在as2中,不支援建構函式的重載,即在一個類中定義多個建構函式,但可以通過條件陳述式進行類比(實際上只有一個建構函式),通過對參數的判斷如參數的類型的檢查來執行不同的代碼。在flash中,Array類的建構函式可以接受不同的參數,產生不同的執行個體,我想實現方法應與此類似。

  四、空建構函式和私人建構函式

  如果在一個類裡含有一個空建構函式(預設是public的,見上面的第1個例子),意為這個類不需要初始化,因為一個類的初始化代碼一般都放在建構函式中。但空建構函式也有可能是一個沒有完成的建構函式,在編寫其它類代碼後,將會在建構函式中補充代碼,這也是編程常用的方法。
  在一個類裡面,如果沒有定義建構函式,as2會建立一個空建構函式,所以一個空建構函式在as2裡意義不大,但如果一個空建構函式被聲明為private,它就具有重大的意義。
  1、抽象類別中的私人建構函式
  首先私人建構函式能保證不能在外部通過new關鍵字被執行個體化,因為抽象類別被執行個體化是沒有意義的。在抽象類別裡面,一般定義了子類所需的統一方法,而抽象類別本身只做為一個統一的資料類型使用,它的執行個體化都要延遲到子類。
  例如:在flash的繪圖中,顏色填充的方式有三種:固體填充、直線漸層填充和放射漸層填充。如果我們要寫一個填充類,最好的方法是先建立一個抽象類別,讓三種具體的填充類來繼承這個抽象類別,這樣,三個具體類就具有了相同的資料類型和統一的介面方法。
  下面是程式碼範例:

//抽象類別
class Brush {
    private function Brush() {
    }
    public function fill(target:MovieClip) {
    }
}
//固體填充類
class SolidBrush extends Brush {    
    function SolidBrush(color, alpha) {        
    }
    public function fill(target:MovieClip) {        
    }
}
//直線漸層填充類
class LinerBrush extends Brush {    
    function LinerBrush(參數) {        
    }
    public function fill(target:MovieClip) {        
    }
}
  使用可把執行個體名的類型定義為Bursh,但具體的執行個體可以是三個裡面的任意一個:
var b:Brush=new SolidBrush();
b.fill();
//
var b:Brush=new LinerBrush ();
b.fill();

  2、具體類中的私人建構函式
  這種情況最常見的是在單例模式中,在單例模式中,一個類只能自己建立一個唯一的執行個體。如下面是一個程式碼範例:

class Load {
    private static var _instance:Load;
    private function Load() {
    }
    public static function getInstance():Load {
        if (Load._instance == undefined) {
            return Load._instance=new Load();
        }
    }
}

  使用:

var t:Load=Load.getInstance()

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。