2010-04-21 9 views
6

इंटरफ़ेस (या सभी विधियों के साथ एक अमूर्त वर्ग) एक स्थिर टाइप की गई भाषा जैसे सी #, जावा में एक शक्तिशाली हथियार है। यह अलग-अलग व्युत्पन्न प्रकारों को एक समान तरीके से उपयोग करने की अनुमति देता है। डिजाइन पैटर्न हमें जितना संभव हो सके इंटरफ़ेस का उपयोग करने के लिए प्रोत्साहित करते हैं।गतिशील भाषा में इंटरफ़ेस?

हालांकि, एक गतिशील टाइप की गई भाषा में, सभी ऑब्जेक्ट्स को संकलित समय पर उनके प्रकार के लिए चेक नहीं किया जाता है। उन्हें एक विशिष्ट तरीके से उपयोग करने के लिए एक इंटरफ़ेस को लागू करने की आवश्यकता नहीं है। आपको बस यह सुनिश्चित करने की आवश्यकता है कि उनके पास परिभाषित कुछ विधियां (विशेषताएं) हैं। यह इंटरफ़ेस आवश्यक नहीं है, या कम से कम उतना उपयोगी नहीं है जितना कि यह स्थिर भाषा में है।

क्या एक सामान्य गतिशील भाषा (उदा। रूबी) में इंटरफ़ेस है? यदि ऐसा होता है, तो इसे रखने के क्या फायदे हैं? यदि ऐसा नहीं होता है, तो क्या हम कई खूबसूरत डिज़ाइन पैटर्न खो रहे हैं जिनके लिए इंटरफ़ेस की आवश्यकता है?

धन्यवाद।

उत्तर

2

मुझे लगता है कि सभी गतिशील भाषाओं के लिए कोई भी जवाब नहीं है। उदाहरण के लिए, पायथन में कोई इंटरफेस नहीं है, लेकिन कई विरासत हैं। इंटरफ़ेस जैसी कक्षाओं का उपयोग करना अभी भी उपयोगी है:

  • इंटरफ़ेस जैसी कक्षाएं विधियों के डिफ़ॉल्ट कार्यान्वयन प्रदान कर सकती हैं;
  • डक-टाइपिंग अच्छा है, लेकिन कुछ हद तक; कभी-कभी isinstance(x, SomeType) लिखने में सक्षम होने के लिए उपयोगी होता है, खासकर जब SomeType में कई विधियां शामिल हैं।
+0

मैं दूसरी बात पसंद है! :) – Shuo

+2

यदि कोई वर्ग डिफ़ॉल्ट कार्यान्वयन प्रदान करता है, तो यह इंटरफ़ेस-जैसी नहीं है क्योंकि अंतरफलक विशेष रूप से सार वर्गों से भिन्न होते हैं जिसमें वे कोई कार्यान्वयन नहीं कर सकते हैं। – sepp2k

+0

@ sepp2k, मैं सहमत हूं। यही वह नहीं है जिसे मैं इंटरफेस कहता हूं। – Shuo

1

गतिशील भाषाओं में इंटरफेस एपीआई के दस्तावेज़ीकरण के रूप में उपयोगी होते हैं जिन्हें स्वचालित रूप से चेक किया जा सकता है, उदा। रनटाइम पर विकास उपकरण या आवेषण द्वारा।

उदाहरण के लिए, zope.interface अजगर में इंटरफेस के लिए वास्तविक मानक है। ज़ोप और ट्विस्ट जैसी परियोजनाएं जो खपत के लिए विशाल एपीआई का पर्दाफाश करती हैं, इसे उपयोगी लगता है, लेकिन जहां तक ​​मुझे पता है कि इस प्रकार की परियोजनाओं के बाहर इसका उपयोग नहीं किया जाता है।

0

रूबी में, जो एक गतिशील रूप से टाइप की गई भाषा है और केवल एकल विरासत की अनुमति देता है, आप "इंटरफ़ेस" के तरीकों के साथ कक्षा को प्रदूषित करने के बजाय मिश्रणों के माध्यम से "इंटरफ़ेस" की नकल कर सकते हैं।

mixins आंशिक रूप से नकल एकाधिक वंशानुक्रम, कई स्रोतों से "इनहेरिट", लेकिन अस्पष्टता और वास्तव में कई माता-पिता होने के जटिलता के बिना एक वस्तु की इजाजत दी। केवल एक सच्चा माता पिता है।

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

बहुत सरल उदाहरण:

module Equippable 
    def weapon 
    "broadsword" 
    end 
end 


class Hero 
    include Equippable 

    def hero_method_1 
    end 

    def hero_method_2 
    end 
end 


class Mount 
    include Equippable 

    def mount_method_1 
    end 
end 


h = Hero.new 
h.weapon # outputs "broadsword" 


m = Mount.new 
m.weapon # outputs "broadsword" 

Equippable हीरो, माउंट के लिए इंटरफेस, और किसी भी अन्य वर्ग या मॉडल है कि यह भी शामिल है।

(जाहिर है, हथियार सबसे अधिक संभावना गतिशील प्रारंभकर्ता है, जो इस उदाहरण में दूर सरलीकृत किया गया है द्वारा निर्धारित किया जाएगा।)

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