ClassScript:類別的Extends(繼承)與Implements(實作)

物件導向的核心價值來自於繼承的機制,當然ClassScript少不了實作此方法。

首先我們來宣告父類別

Abstract.Class("Animal")(function(){
    var name
 
    this.constructor = function(n){
        name = n
    }
 
    this.getName = function(){
        return name;
    }
 
    this.setName = function(n){
        name = n;
    }
});

接下來宣告子類別

Class("Dog").Extends(Animal)(function(){
 
    this.showName = function(){
        alert(name);
    }
})

建立Dog物件,並呼叫方法

var d = new Dog("Bob");
 
alert(d.getName()); //→ 顯示 "Bob"
d.showName() //→ 顯示  ""(null) 私有屬性不會被繼承,所以沒有定義name變數

ClassScript也實作了Implements方法,與Java不同的是,介面不一定要為純抽象的,介面中的方法如果有定義,那類別就直接實作了介面的方法,除非你有重新定義方法,否則他將會直接以介面的方法作為實際的內容。

這部分雖然可以寫成限制必須為Interface的類別才能實作,但JavaScript並沒有強制變數型態,限制這樣的做法反而會失去彈性與簡單性。

Interface('myInterface')({
    run: function(){
        alert('the ' + this.name + ' is running!');
    }
})
 
Class("Animal").Implements(myInterface)(function(){
    this.name
 
    this.constructor = function(n){
        this.name = n
    }
 
    this.getName = function(){
        return this.name;
    }
 
    this.setName = function(n){
        this.name = n;
    }
});
 
var ani1 = new Animal("Pig");
ani1.run() // → 顯示 'the Pig is running!'

這裡有的必須注意的地方就是,介面中的方法不能操作私有屬性,因為這是JavaScript的限制,目前還沒找到比較好的作法,所以目前最好的方式就是使用公開屬性。不然就使用覆寫的方式。一個介面的方法如果被覆寫了,他所在的變數區域就可以取得類別的私有成員。

One Response to “ClassScript:類別的Extends(繼承)與Implements(實作)”

  1. Frank - 七月 10, 2009

    赞 真的是不错! 都到这境界了

回應(Leave a Reply)