[英]Class inheritance, and requiring subclasses from different files with Coffeescript
我試圖組織我的代碼,但有未定義的超類問題。 我希望這只是一個負載路徑問題,但我無法弄明白。 我正在運行這個:
coffee rooms.coffee
rooms.coffee
Room = require('./rooms/room')
module.exports = class Rooms extends Object
constructor: ->
@
房間/ room.coffee
module.exports = class Room
@Active: require('./active')
constructor: (@id) ->
@users = {}
房間/ active.coffee
Room = require('./room')
console.log Room #=> {}
module.exports = class Active extends Room
constructor: (@id) ->
@type = "Active"
super
如果我嘗試new Active
,我會收到以下錯誤:
TypeError: Cannot read property 'constructor' of undefined
Active
的super
列為undefined
:
[Function: Active] __super__: undefined
為什么Room
未定義? (或者說,只是一個空的對象?)
更新
這是由循環依賴引起的,正如下面許多人所指出的那樣。 我最后只是將子類定義放在基類定義中,而不是嘗試將它們保存在單獨的文件中。 像這樣的東西:
class Room
constructor: ->
# ...
class @Active extends Room
constructor: ->
# ...
class @Inactive extends Room
constructor: ->
# ...
active = new Room.Active
inactive = new Room.Inactive
這種情況下,將代碼簡化為最原始的部分(同時仍然看到錯誤)是很有啟發性的。 如果我們刪除了需求並刪除了大部分代碼,我們可以得到這樣的結構:
class Room
@foo = "bar"
class Active extends Room
console.log Room.foo
打印:按預期方式bar
。
所以現在讓我們嘗試更接近原始示例:
class Room
@foo = Active
class Active extends Room
console.log Room.foo
這打印undefined
因為在定義Room.foo時undefined
Active
。
最后,讓我們來看看定義是否相反的情況:
class Active extends Room
class Room
@foo = Active
console.log Room.foo
這會引發錯誤,因為無法擴展undefined
。
最后兩種情況表示更改原始示例中的require順序。 讓基類的定義依賴於它的子類應該會導致你的OOP警報鈴聲響起! :)
可能有一種方法可以稍微更改定義以使其工作,但具有這些相互依賴性的代碼往往不可維護。 我建議找出一種完全解耦類的方法。
我不能確定這一點,但我可能遇到過類似的問題 - 可能是因為文件room / active.coffee按字母順序排在room / room.coffee之前,所以當加載active.coffee文件時首先看一下Active
類, room.coffee和Room
還沒有,所以無法找到超類。
我在編譯時使用-j
運算符來解決這個問題,所以當你的.coffee文件很好並且有條理時,它們會編譯成一個.js文件,這也有其他優點。
@Active: require('./active')
刪除它,或將其移動到其他地方。 你有一個循環依賴。 當你定義room.coffee
,你告訴它在完成定義Room
之前需要active.coffee
,而active.coffee
需要Room
,所以當需要active.coffee
時, Room
將是undefined
。
你應該能夠在最后添加一個Room::Active = require('./active')
,但后來我問你為什么甚至首先需要這個oO
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.