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 = {}

部屋/アクティブ.コーヒー

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
4

3 に答える 3

2

これは、コードを最も原始的な部分まで単純化することで(まだエラーが発生している間に)明らかになっている場合です。requireを削除し、ほとんどのコードを削除すると、次のような構造を取得できます。

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

Room.fooが定義されたときに定義されなかっundefinedたため、これが出力されます。Active

最後に、定義が逆になっている場合を見てみましょう。

class Active extends Room

class Room
  @foo = Active

console.log Room.foo

を拡張することはできないため、これはエラーをスローしますundefined

最後の2つのケースは、元の例で必要な順序を変更することを表しています。基本クラスの定義をそのサブクラスに依存させると、OOPアラームベルが鳴り始めます。:)

これを機能させるために定義を少し変更する方法があるかもしれませんが、これらの種類の相互依存関係を持つコードは、せいぜい保守できない傾向があります。クラスを完全に切り離す方法を考え出すことをお勧めします。

于 2012-09-21T06:27:35.647 に答える
0

@Active: require('./active')これを削除するか、別の場所に移動してください。循環依存関係があります。を定義するときは、 の定義が完了する前room.coffeeに require するように指示しているので、 が必要になるのはいつになるかということです。active.coffeeRoomactive.coffeeRoomRoomundefinedactive.coffee

最後にa を追加するだけでよいはずですがRoom::Active = require('./active')、そもそもなぜこれが必要なのかお尋ねします oO

于 2012-09-21T07:07:51.383 に答える
0

これについては確信が持てませんが、同様の問題が発生した可能性があります-ファイルroom/active.coffeeがアルファベット順でroom/room.coffeeの前にあるという事実に関係している可能性があるため、 active.coffeeファイルがロードされたときActiveクラスは room.coffee で最初に検索され、まだ検索Roomれていないため、スーパークラスが見つかりません。

私は-jコンパイル時にオペレーターを使用することでこれを回避しました。そのため、.coffeeファイルはきちんと整理されていますが、単一の.jsファイルにコンパイルされます。これには他の利点もあります。

于 2012-09-21T05:27:02.193 に答える