2011-11-29 37 views
7

CoffeeScript là tuyệt vời, hệ thống lớp học thực sự là tất cả javascript cần thiết, một vài từ khóa và rất ít proto * và niềng răng ở khắp mọi nơi. Tôi đã nhìn thấy mọi người thực hiện mixins trong các lớp, nhưng tôi tự hỏi nếu có một con đường để thực hiện một tương tự với giao diện Java?CoffeeScript, triển khai 'thực hiện'

Nếu không, nó có thể là một bổ sung tốt .. Sau khi tất cả, nó sẽ là tốt để biết nếu mã của tôi có thể thành công đi bộ/quack như một con vịt lúc biên dịch. Các hướng dẫn sau đây có thể giúp đỡ tốt hơn những gì sẽ là lý tưởng ... Ngay bây giờ bạn có thể làm việc xung quanh nó bằng cách tạo các bài kiểm tra đơn vị (mà bạn nên làm) để nó không phải là một thỏa thuận lớn, nhưng vẫn sẽ tốt đẹp.

class definitiona 
class definitionb 

class featurex 
class featurey 

class childa extends definitiona implements featurex 
class childb extends definitionb implements featurex, featurey 

Trả lời

8

Nói chung, JavaScript từ chối Java-isms như giao diện. Sau khi tất cả, tính hữu ích của giao diện là họ kiểm tra xem các đối tượng "quack như một con vịt" tại thời gian biên dịch, và JavaScript không phải là một ngôn ngữ biên dịch. CoffeeScript, nhưng những thứ như thực thi giao diện thì vượt xa phạm vi của nó. Ngôn ngữ biên dịch-to-JS chặt chẽ hơn như Dart có thể tăng thêm con hẻm của bạn.

Mặt khác, nếu bạn muốn thực hiện featurexfeatureymixins, đó là điều khá phổ biến và dễ thực hiện trong vùng CoffeeScript. Bạn có thể muốn xem classes chapter trong Sách nhỏ trên CoffeeScript, cho biết việc thực hiện điều này dễ dàng như thế nào: Chỉ cần xác định featurex làm đối tượng có phương pháp bạn thêm vào nguyên mẫu childa.

1

Tôi có cùng sự cố và tôi đã cố giải quyết vấn đề bằng cách thêm phương thức includes vào Function. Tôi đã mô tả nó here. Giải pháp này cho phép triển khai nhiều giao diện và cung cấp phương thức bổ sung cho nguyên mẫu Object có thể được sử dụng thay cho toán tử instanceof (vì chúng tôi không thể ghi đè bất kỳ toán tử JavaScript nào).

6

Tôi biết tôi đã đến dự tiệc. Tôi sẽ không tranh luận về giá trị của lý do tại sao/tại sao không làm điều này vì nó chỉ là một công cụ trong hộp công cụ của nhà phát triển của bạn, nhưng đây là cách tôi làm điều đó:

class.coffee

# ref - http://arcturo.github.io/library/coffeescript/03_classes.html#extending_classes 
# ref - http://coffeescriptandnodejs.blogspot.com/2012/09/interfaces-nested-classes-and.html 

# 
# @nodoc 
# 
classKeywords = ['extended', 'included', 'implements', 'constructor'] 

# 
# All framework classes should inherit from Class 
# 
class Class 

    # 
    # Utility method for implementing one of more mixin classes. 
    # 
    # @param objs [Splat] One or more mixin classes this class will *implement*. 
    # 
    @implements: (objs...) -> 
     for obj in objs 
      if typeof obj is 'function' and Boolean(obj.name) 
       obj = obj.prototype 

      for key, value of obj #when key not in moduleKeywords 
       # Assign properties to the prototype 
       if key not in classKeywords 
        #console.log 'implementing', value.toString(), 'as', key 
        @::[key] = value 

      obj.included?.apply(@) 
     this 

    # 
    # Utility method for adding getter/setters on the Class instance 
    # 
    # @param prop [String] The name of the getter/setter. 
    # @param desc [Object] The object with a getter &/or setter methods defined. 
    # 
    @property: (prop, desc)-> Object.defineProperty @prototype, prop, desc 

interface.quack.coffee

class iQuack 
    quack: -> throw new Error 'must implement interface method' 

duck.coffee

class Duck extends Class 
    @implements iQuack 

    quack: -> console.log 'quack, quack' 

https://gist.github.com/jusopi/3387db0dd25cd11d91ae

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