3

我正在尝试组织我的代码,但遇到未定义的超类的问题。我希望这只是一个加载路径问题,但我无法弄清楚。我正在运行这个:

coffee rooms.coffee

房间.咖啡

Room = require('./rooms/room')

module.exports = class Rooms extends Object
    constructor: ->
        @

房间/房间.咖啡

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
4

3 回答 3

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 警钟开始响起!:)

可能有一种方法可以稍微更改定义以使其工作,但是具有这些相互依赖关系的代码充其量往往是不可维护的。我建议找出一种完全解耦类的方法。

于 2012-09-21T06:27:35.647 回答
0

我不能确定这一点,但我可能遇到过类似的问题 - 这可能与文件room/ active.coffee按字母顺序位于 room/room.coffee 之前的事实有关,因此当加载active.coffee文件时Active类是先看的,room.coffee没有Room,所以找不到超类。

我通过-j在编译时使用运算符解决了这个问题,因此,虽然您的.coffee文件很好且有条理,但它们编译成单个.js文件,这也有其他优点。

于 2012-09-21T05:27:02.193 回答
0

@Active: require('./active')删除它,或将它移到其他地方。你有一个循环依赖。当你定义时room.coffee,你告诉它active.coffee在它可以完成定义之前需要Room,并且active.coffee需要Room,所以Room在需要undefinedactive.coffee也是如此。

你应该可以Room::Active = require('./active')在最后添加一个,但是我问你为什么首先需要这个 oO

于 2012-09-21T07:07:51.383 回答