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(實作)”
赞 真的是不错! 都到这境界了
回應(Leave a Reply)