簡體   English   中英

類繼承,並要求使用Coffeescript從不同文件中創建子類

[英]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

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

這種情況下,將代碼簡化為最原始的部分(同時仍然看到錯誤)是很有啟發性的。 如果我們刪除了需求並刪除了大部分代碼,我們可以得到這樣的結構:

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.coffeeRoom還沒有,所以無法找到超類。

我在編譯時使用-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM