2012-09-21 61 views
3

我想組織我的代碼有點但有問題與未定義的超類。我希望這只是一個負載路徑問題,但我無法弄清楚。我與運行以下命令:類繼承,並要求與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 

Activesuper被列爲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 
+0

題外話,但到底是什麼'#=>'怎麼辦? – Thilo

+0

這只是一個評論,我顯示該命令的輸出(它只輸出一個空對象) – bricker

+0

我明白了。以爲我錯過了一些奇特的新語法。 – Thilo

回答

2

這是一種將代碼簡化爲最原始的部分(同時仍然看到錯誤)的照明。如果我們去掉要求並去掉大部分的代碼,我們可以得到一個結構是這樣的:

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因爲Active Room.foo定義時沒有定義。

最後,讓我們看看情況是定義是相反的:

class Active extends Room 

class Room 
    @foo = Active 

console.log Room.foo 

此拋出一個錯誤,因爲它不是可以延長undefined

最後兩種情況代表在原始示例中更改要求訂單。讓基類的定義取決於它的子類應該會導致OOP警報鈴響起! :)

可能有一種方法可以稍微改變定義來完成這項工作,但具有這種相互依賴性的代碼往往無法維持。我建議找出一種方法來徹底解耦類。

+0

你是對的,這是一個循環依賴問題。我最終將子類定義放在'Room'類中,而不是試圖將它們保存在單獨的文件中。查看我的更新。謝謝! – bricker

0

我不能肯定,但我可能有一個類似的問題 - 這可能是做的事實,文件房間/ active.coffee是以前房/room.coffee按字母順序排列的,所以當active.coffee文件加載Active類是第一次看,room.coffeeRoom一直沒還,所以超無法找到。

我身邊這讓使用-j運營商在編譯時間,所以當你的.coffee文件是很好的和有組織的,他們編譯成一個單一的的.js文件,它具有其他優點。

0

@Active: require('./active')刪除此內容,或將其移至別處。你有一個循環依賴。當你定義room.coffee,你告訴它需要active.coffee,纔可以完成定義Roomactive.coffee需要Room,所以Roomundefined時,需要active.coffee

你應該能夠只是在末尾添加一個Room::Active = require('./active'),但後來我問爲什麼,你甚至需要這個擺在首位o.O