2011-11-29 27 views
7

कॉफीस्क्रिप्ट शानदार है, कक्षा प्रणाली वास्तव में सभी जावास्क्रिप्ट की आवश्यकता है, कुछ कीवर्ड और बहुत कम प्रोटो * और हर जगह ब्रेसिज़ हैं। मैंने लोगों को कक्षाओं में मिश्रित क्रियाओं को लागू किया है, लेकिन मुझे आश्चर्य है कि जावा इंटरफेस के समानता को लागू करने का कोई तरीका है या नहीं?कॉफीस्क्रिप्ट, 'लागू' लागू करने

यदि यह अच्छा नहीं हो सकता है .. आखिरकार, यह जानना अच्छा होगा कि मेरा कोड संकलित समय पर बतख की तरह सफलतापूर्वक चल सकता है या नहीं। निम्नलिखित निर्देश आदर्श होने में बेहतर मदद कर सकते हैं ... अभी आप यूनिट परीक्षण (जिसे आपको वैसे भी करना चाहिए) बनाकर इसके आसपास काम कर सकते हैं, इसलिए यह इतना बड़ा सौदा नहीं है, लेकिन फिर भी अच्छा होगा।

class definitiona 
class definitionb 

class featurex 
class featurey 

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

उत्तर

8

आम तौर पर, जावास्क्रिप्टर्स जावा-आईएमएस इंटरफेस की तरह अस्वीकार करते हैं। आखिरकार, इंटरफेस की उपयोगिता यह है कि वे जांचते हैं कि संकलन समय पर ऑब्जेक्ट्स "बतख की तरह रैक" करते हैं, और जावास्क्रिप्ट एक संकलित भाषा नहीं है। कॉफीस्क्रिप्ट है, लेकिन इंटरफेस को लागू करने जैसी चीजें इसके दायरे से बहुत दूर हैं। डार्ट की तरह एक कठोर संकलन-से-जेएस भाषा आपकी गली को और अधिक हो सकती है।

दूसरी ओर, यदि आप featurex और featureyरूप mixins करना चाहता था, कि कुछ काफी आम और CoffeeScript-देश में ऐसा करना आसान है कि है। आप में कॉफीस्क्रिप्ट पर लिटिल बुक, पर एक नज़र डालना चाहेंगे जो यह दिखाता है कि ऐसा करना कितना आसान है: featurex को उस ऑब्जेक्ट के रूप में परिभाषित करें जिसका आप childa के प्रोटोटाइप में जोड़ते हैं।

1

मुझे एक ही समस्या है, और मैंने includesFunction विधि जोड़कर इसे हल करने का प्रयास किया है। मैंने इसे here वर्णित किया। यह समाधान एकाधिक इंटरफेस को कार्यान्वित करने की अनुमति देता है और Object प्रोटोटाइप के लिए अतिरिक्त विधि प्रदान करता है जिसका उपयोग instanceof ऑपरेटर के बजाय किया जा सकता है (क्योंकि हम किसी भी जावास्क्रिप्ट ऑपरेटर को ओवरराइड नहीं कर सकते हैं)।

6

मुझे पता है कि मैं पार्टी के लिए देर हो चुकी हूं। मैं क्यों/क्यों यह करने के लिए नहीं के रूप में यह अपने डेवलपर के पिटारे में सिर्फ एक उपकरण है की खूबियों बहस नहीं होगा, लेकिन यह कैसे मैं यह कर रहा है:

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

संबंधित मुद्दे