Próbuję trochę zorganizować mój kod, ale posiadający problemy z niezdefiniowanymi superclassami. Mam nadzieję, że jest to tylko problem ścieżki ładunku, ale nie mogę tego zrozumieć. Działam to z:

coffee rooms.coffee

pokoje.coffee

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

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

pokoje / pokój.Coffee

module.exports = class Room
    @Active: require('./active')

    constructor: (@id) ->
        @users = {}

Pokoje / Active.Coffee

Room = require('./room')

console.log Room #=> {}

module.exports = class Active extends Room
    constructor: (@id) ->
        @type = "Active"
        super

A jeśli spróbuję zrobić new Active, otrzymam następujący błąd:

TypeError: Cannot read property 'constructor' of undefined

Active 's super jest wymieniona jako undefined:

[Function: Active] __super__: undefined

Dlaczego Room nieokreślony? (A raczej, tylko pusty obiekt?)

Aktualizuj

Było to spowodowane przez zależność okrągły, jak wskazano wiele osób poniżej osób. Skończyło się tylko włożenie definicji podklasu w środku definicji baseClass, zamiast próbować utrzymać je w osobnych plikach. Coś takiego:

class Room
  constructor: ->
    # ...

  class @Active extends Room
    constructor: ->
      # ...

  class @Inactive extends Room
    constructor: ->
      # ...

active   = new Room.Active
inactive = new Room.Inactive
3
bricker 21 wrzesień 2012, 08:03

2 odpowiedzi

Najlepsza odpowiedź

Jest to przypadek, w którym upraszczający kod do jego najbardziej prymitywnych części (podczas gdy nadal widząc błędy) świeci. Jeśli usuniemy wymagane i zdejmij większość kodu, możemy uzyskać taką strukturę:

class Room
  @foo = "bar"

class Active extends Room

console.log Room.foo

Które wydruki: bar zgodnie z oczekiwaniami.

Więc teraz spróbujmy uzyskać trochę bliżej pierwotnego przykładu:

class Room
  @foo = Active

class Active extends Room

console.log Room.foo

To wydruki undefined, ponieważ Active nie została zdefiniowana, gdy zdefiniowano pokój.Foo.

Wreszcie, spójrzmy na sprawę, gdyby definicje są odwrócone:

class Active extends Room

class Room
  @foo = Active

console.log Room.foo

To rzuca błąd, ponieważ nie jest możliwe rozszerzenie undefined.

Dwa ostatnie przypadki reprezentują zmianę kolejności wymagań w oryginalnym przykładzie. Posiadanie definicji klasy bazowej zależą od podklasy powinny spowodować dzwonki alarmowe OOP, aby rozpocząć dzwonienie! :)

Mogą istnieć sposób, aby nieznacznie zmienić definicje, aby wykonać tę pracę, ale kod z tymi typami wzajemnych zależności ma tendencję do najlepiej niezgodne. Poleciłbym dowiedzieć się, aby całkowicie odłączyć zajęcia.

2
David Weldon 21 wrzesień 2012, 06:41

@Active: require('./active') Usuń to lub przenieś to gdzie indziej. Masz zależność kołową. Kiedy definiujesz room.coffee, mówiąc, aby wymagać active.coffee, zanim może zakończyć definiowanie Room, a active.coffee wymaga Room, więc {{x6} } Będzie undefined, gdy wymagana jest active.coffee.

Powinieneś być w stanie dodać Room::Active = require('./active') na końcu, ale potem pytam, dlaczego nawet potrzebujesz tego na pierwszym miejscu o.o

0
Jonathan Ong 21 wrzesień 2012, 07:07