2013-01-05 35 views
5

Tôi đang tạo ứng dụng Node.js bằng cách sử dụng coffeescript hướng đối tượng.Bản ghi: tự động tạo thể hiện của lớp mà phương thức được gọi trên

Tôi có một super class với một phương pháp tĩnh như:

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

Có một lớp con như

class User extends RedisObject 

Khi tôi gọi find() trên User class Tôi muốn nó vượt qua một thể hiện của User thay của RedisObject đến hàm gọi lại.

Tôi cố gắng để thực hiện điều này bằng cách nhận được tên lớp của lớp thực tế phương pháp này được gọi là trên bằng cách sử dụng

@constructor.name 

và sử dụng eval() để tạo ra một thể hiện từ nó - nhưng vấn đề là các lớp con sẽ không được xác định từ bên trong lớp cha.

Làm cách nào để nhận ra hành vi nhận các loại cá thể khác nhau được trả về theo phương pháp find tùy thuộc vào lớp nào được gọi, mà không phải ghi đè lên từng lớp con?

Trả lời

6

Tôi không phải là chuyên gia về CoffeeScript, nhưng công việc này có hoạt động không?

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" 

Ít nhất thử nghiệm trên dường như đã qua.

+0

cảm ơn! hoạt động hoàn hảo. – Matthias

+1

Btw, "mới này" không phải là tài liệu tính năng, tôi không thể tìm thấy nó từ phần Lớp học. Nó thực sự hữu ích, nó nên được specced. – Ciantic

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

và trong lớp phụ

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

đó là những gì tôi sẽ làm gì mặc dù nó không phải là 100% năng động.

Các vấn đề liên quan