2013-07-24 4 views
5

मैं एक शौकिया अनुभव शौक प्रोग्रामर हूं, और मुझे सी ++, डी, जावा, सी # और अन्य के साथ अच्छी परिचितता है।स्पष्ट घोषणा के बिना इंटरफ़ेसिंग की गो की शैली का समर्थन करने वाली अन्य भाषाएं कौन सी भाषाएं समर्थन करती हैं?

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

interface ITest { 
    void Test(); 
} 

class Test { 
    void Test() { } 
} 

void main() { 
    ITest x; 
    x = new Test; 
} 

किन भाषाओं का यह देखना होगा, और स्वचालित रूप से झंडा TestITest को लागू करने के रूप में:

क्या मैं देख रहा हूँ एक प्रोग्रामिंग भाषा है कि यह करता है?

ईटीए: मैं बतख टाइपिंग की तलाश नहीं कर रहा हूं। मैं अनुमान के साथ कड़ाई से टाइप की गई भाषाओं की तलाश में हूं।

+0

क्या जावास्क्रिप्ट गिनती है? आप किसी भी ऑब्जेक्ट पर 'टेस्ट()' फ़ंक्शन को इंटरफ़ेस घोषित किए बिना कॉल कर सकते हैं। –

+0

मुझे यकीन नहीं है कि यह प्रश्न SO के लिए उपयुक्त है। यदि आप गो की इस शानदार विशेषता वाले भाषाओं की एक सूची चाहते हैं, तो शायद प्रोग्रामर.से बेहतर होगा। –

+1

क्या आप बतख टाइपिंग का उपयोग कर किसी भी भाषा की तलाश में हैं? जेएस, पायथन, रूबी, आदि? –

उत्तर

12

डी में कुछ है wrap अपनी मानक लाइब्रेरी में, फोबोस, जो आप खोज रहे हैं कर सकते हैं। यहाँ एक उदाहरण समारोह के unittest से नकल है:

interface A { 
    int run(); 
} 

interface B { 
    int stop(); 
    @property int status(); 
} 

class X { 
    int run() { 
    return 1; 
    } 

    int stop() { 
    return 2; 
    } 

    @property int status() { 
    return 3; 
    } 
} 

auto x = new X(); 

auto ab = x.wrap!(A, B); 
A a = ab; 
B b = ab; 
assert(a.run() == 1); 
assert(b.stop() == 2); 
assert(b.status == 3); 

काम v2.064 से उपलब्ध हो जाएगा, और यह पहले से ही Git सिर पर है।

+1

यह पुल अनुरोध का लिंक है https://github.com/D-Programming-Language/phobos/pull/1265 – yaz

+1

यदि आप अपना मूल एक्स वापस चाहते हैं, तो बस 'ab.unwrap! X() '। –

0

वस्तुतः किसी भी गतिशील भाषा (जावास्क्रिप्ट, पायथन, आदि ...) इस पैटर्न का समर्थन करता है। लेकिन मुझे लगता है कि आप उन भाषाओं में रूचि रखते हैं जो स्थिर रूप से सत्यापित करते हैं कि प्रकार इंटरफ़ेस को प्रश्न में संतुष्ट करता है।

सी ++

यह समर्थन आप हालांकि क्योंकि आप ITest सीधे प्रयोग नहीं करेंगे के लिए वास्तव में क्या कह रहे हैं नहीं है। इसके बजाय आप जो केवल प्रकार

// C# style solution 
void UseIt(ITest p) { 
    p.Test(); 
} 

// C++ style solution 
template <typename T> 
void UseIt(T p) { 
    p.Test(); 
} 

सी ++ UseIt विधि किसी भी प्रकार जो एक सुलभ सदस्य Test है के लिए काम करेंगे की आवश्यक सदस्यों का उपयोग एक टेम्पलेट का प्रयोग करेंगे। यहाँ की जरूरत

class C1 { 
public: 
    void Test() { } 
} 

class C2 { } 

UseIt<C1>(C1()); // Ok 
UseIt<C2>(C2()); // Error! 

टाइपप्रति

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

एफ # में वर्णित से मेल खाता है

एफ # सेल्सियस तक ++ समान समर्थन सदस्य की कमी के माध्यम से इनलाइन घोषणाओं पर है

let inline UseIt<^T when ^T : (member Test: unit -> unit)> s = ... 
+0

हाँ, और डी इस संबंध में सी ++ के समान है। –

+0

@ AdamD.Ruppe मुझे लगता है कि डी था लेकिन मुझे समझदारी से इसके लिए पर्याप्त अनुभव नहीं था – JaredPar

+0

यह काफी नहीं है जो मैं ढूंढ रहा था: एक टेम्पलेट/जेनेटिक समाधान है (जब तक कि संकलक बहुत स्मार्ट नहीं है) कई मशीन कोड अनुक्रम जुड़े हुए हैं, जबकि एक इंटरफ़ेस समाधान आमतौर पर केवल एक होता है (एक इंटरफ़ेस टेबल लुकअप पर निर्भर)। –

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

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