5

我正在使用面向对象的咖啡脚本构建一个 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我希望它传递一个实例User而不是RedisObject回调函数。

我试图通过获取调用该方法的实际类的类名来实现这一点

@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 回答