5

オブジェクト指向のcoffeescriptを使用してNode.jsアプリケーションを構築しています。

私は次のsuper classような静的メソッドを持っています:

class RedisObject
 @find: (id, cb) ->
    client.HGETALL "#{@className()}|#{id}", (err, obj) =>
      unless err
        cb(new RedisObject(obj, false))

のようなサブクラスがあります。

  class User extends RedisObject

を呼び出すときにfind()、コールバック関数の代わりにのUser classインスタンスを渡したいです。UserRedisObject

を使用してメソッドが呼び出される実際のクラスのクラス名を取得することで、これを実現しようとしました

@constructor.name

それからインスタンスを生成するために使用eval()しますが、問題は、サブクラスがスーパークラス内から未定義になることです。

find各サブクラスでオーバーライドすることなく、メソッドが呼び出されたクラスに応じて、メソッドによって返されるさまざまなタイプのインスタンスを取得する動作をどのように実現できますか?

4

2 に答える 2

6

私は CoffeeScript の専門家ではありませんが、これでうまくいきませんか?

class RedisObject
  whoami: () -> "I am a RedisObject"
  @find: () ->
    new this()

class User extends RedisObject
  whoami: () -> "I am a User"

console.log RedisObject.find().whoami() // -> "I am a RedisObject"
console.log User.find().whoami()        // -> "I am a User"

少なくとも上記のテストはパスするようです。

于 2013-01-05T15:22:22.183 に答える
0
@find: (id, cb,klass=RedisObject) ->
    client.HGETALL "#{@className()}|#{id}", (err, obj) =>
      unless err
        cb(new klass(obj, false))

そしてサブクラスで

@find: (id, cb,klass=User) ->
    super(id,cd,klass)

100%動的ではありませんが、それは私がすることです。

于 2013-01-05T15:03:28.680 に答える