2016-08-29 13 views
5

Programming Languages: Principles and Paradigms, by Maurizio Gabbrielli, Simone Martiniक्या प्रोग्रामिंग भाषाओं में बहुरूपता शामिल प्रकारों के बीच सबसेट संबंध दर्शाती है?

डी फाई nition 8.5 एक प्रकार प्रणाली है जिसमें एक ही वस्तु अधिक से एक प्रकार हो सकता है से बहुरूपी होना कहा जाता है।

समानता के अनुसार, हम कहेंगे कि ऑब्जेक्ट पॉलीमोर्फिक है जब सिस्टम इसे एक से अधिक प्रकार निर्दिष्ट करता है।

जब कोई ऑब्जेक्ट पॉलीमोर्फिक होता है, तो मान लें कि इसे टाइप टी 1 और टाइप टी 2 असाइन किया गया है। क्या यह हमेशा सच है कि दो प्रकारों में से एक टी 1 और टी 2 दूसरे का उप-समूह है? (ध्यान दें कि यदि आपको लगता है कि यह सत्य नहीं है, तो आप इसे counterexample देकर अस्वीकार कर सकते हैं।)

यदि यह सत्य है, तो क्या हम कह सकते हैं कि बहुरूपता उन प्रकारों के स्तर पर होती है जो स्तर के स्तर से अधिक हैं ऑब्जेक्ट्स, इस अर्थ में, माना जाता है कि टी 1 टी 2 का सबसेट है, टी 1 की किसी ऑब्जेक्ट को टी 2 भी असाइन किया जा सकता है?

यदि यह सत्य नहीं है, तो क्या हम कह सकते हैं कि बहुरूपता केवल प्रकार के स्तर की बजाय वस्तुओं के स्तर पर होती है, इस अर्थ में, टी 1 की एक अन्य वस्तु को टी 2 असाइन नहीं किया जा सकता है, और दूसरी वस्तु टी 2 को टी 1 असाइन नहीं किया जा सकता है?

धन्यवाद।

+3

'कक्षा फू इंटरफ़ेस 1, इंटरफ़ेस 2 {} 'लागू करता है। –

+3

चूंकि यह भाषा अज्ञेयवादी है (कम से कम मुझे लगता है कि यह होना चाहिए) प्रोग्रामर.एसई पर इसे पोस्ट करना बेहतर हो सकता है। – NathanOliver

+0

मुझे लगता है कि यह सच है, लेकिन मुझे नहीं पता कि मैं क्यों कर रहा हूं। यह सिर्फ मुझे समझ में आता है। (बेशक, टाइप सिस्टम का दुरुपयोग करना शायद संभव है, लेकिन विरासत को सबसेट प्रकार के संबंध दिखाने के लिए डिज़ाइन किया गया है) –

उत्तर

3

उदाहरण

हैं प्रकार टी 2 के हर ऑब्जेक्ट प्रकार T1 की भी है, तो टी 2 टी 1 के एक उप-प्रकार है। इसका मतलब है कि आम तौर पर टी 2 से टी 2 प्राप्त होता है। यहाँ एक जावा उदाहरण: टी 2 और विरासत में मिला टी 1:

class T1 
{ 
    public void f() { 
     System.out.println ("hello I'm f() in T1"); 
    } 
} 
class T2 extends T1 
{ 
    public void f() { 
     System.out.println ("hello I'm f() in T2"); 
    } 
} 
... 
    T1 o = new T2(); 
    o.f();   // behavior depends if o refers to a T1 or a T2. 
... 

Online demo

तो इस उदाहरण में ओ वस्तु के दो प्रकार हैं। इसका व्यवहार निश्चित रूप से बहुलक है।

काउंटर उदाहरण: यह एक व्यापकता

एक वस्तु जरूरी एक प्रकार एक और की एक उप-प्रकार किया जा रहा बिना कई प्रकार के हो सकते हैं नहीं है। आमतौर पर, आप उदाहरण इस C++ के रूप में कई विरासत हो सकता था,:

class T1 { 
public: 
    virtual void f() { 
     cout<<"I'm f() from T1"<<endl; 
    } 
}; 
class T2 { 
public: 
    virtual void f() { 
     cout<<"I'm f() from T2"<<endl; 
    } 
    virtual void g() { 
     cout<<"I'm g() from T2"<<endl; 
    } 
}; 
class T3 : public T1, public T2 { 
public: 
    void f() { 
     T2::f(); 
     T1::f(); 
    } 
}; 

यहाँ हर ओ उद्देश्य यह है कि एक T3 होगा भी एक T1 और एक टी 2 के साथ ही होगा। टी 1 और टी 3 और टी 2 और टी 3 के बीच एक सबसेट समावेश संबंध है लेकिन टी 1 और टी 2 के बीच नहीं है। तो यह मुझे आपके सामान्य बयान का एक अच्छा काउंटर उदाहरण लगता है।

Live C++ example

अन्य विचार

आप का नाटक नहीं कर सकते हैं कि बहुरूपता केवल वस्तुओं के स्तर पर होता है। कम से कम टाइप सिस्टम और आपके द्वारा दी गई परिभाषाओं के साथ कम से कम नहीं।

वस्तु हालांकि पॉलीमोर्फिज्म के आधारशिला है।उदाहरण के लिए, सी ++ में आप अपनी परिभाषा के अनुसार पॉलिमॉर्फिक प्रकार प्राप्त कर सकते हैं, जो इस तरह व्यवहार करेंगे जैसे कि उनके संदर्भ के आधार पर केवल एक ही प्रकार होगा और जिस प्रकार से उन्हें संदर्भित किया गया है: बस C12+ उदाहरण से virtual कीवर्ड को हटा दें क्या होता है यह देखने के लिए ऊपर।

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