2012-06-06 12 views
13

लोगकैसे ओवरलोडिंग संकलन समय है और ओवरराइडिंग रनटाइम है?

मैं बहुरूपता को समझने के लिए कई धागे में आया (दोनों संकलन समय और रन टाइम)। मैं कुछ लिंक देखकर आश्चर्यचकित था जहां प्रोग्रामर ओवरलोडिंग का दावा कर रहे हैं रनटाइम और ओवरराइडिंग संकलन समय है।

क्या मैं यहाँ से जानना चाहता हूँ है:

  1. रनटाइम एक वास्तविक समय उदाहरण और छोटे कोड और क्या परिदृश्य हम का उपयोग करना चाहिए साथ बहुरूपता।
  2. रीयल टाइम उदाहरण और छोटे कोड और उपयोग करने के लिए समय संकलित समय पॉलिमॉर्फिज्म।

क्योंकि मैंने कई सैद्धांतिक परिभाषाएं पढ़ी हैं, लेकिन मैं इसे समझने में संतुष्ट नहीं हूं।

इसके अलावा, मैंने एक विचार दिया, जहां मैंने महसूस किया कि ओवरलोडिंग रनटाइम होना चाहिए क्योंकि, मेरे पास एक तरीका है जो रनटाइम पर क्षेत्र की गणना करता है, केवल यह तय करता है कि मेरे द्वारा पारित पैरामीटर के आधार पर कॉल करने के लिए कौन सी ओवरलोडेड विधि है (कहें अगर मैं केवल एक पैरामीटर पास करता हूं, तो इसे स्क्वायर को आग लगाना चाहिए, और यदि पैरामीटर 2 हैं, तो उसे आयताकार आग लगनी चाहिए) .... तो क्या मैं इसे अपने रनटाइम का दावा नहीं कर सकता? इसकी शिकायत का समय कैसा है? (ज्यादातर सैद्धांतिक रूप से कहते हैं, ओवरलोडिंग संकलन समय है लेकिन वे एक वास्तविक वास्तविक समय उदाहरण भी नहीं देते हैं ... बहुत कम इसके रनटाइम का दावा करते हैं) ....

इसके अलावा, मुझे लगता है कि ओवरराइडिंग संकलित समय है क्योंकि, जब आप कोड लिखते हैं और शिकायत करें, आप सुनिश्चित करते हैं कि आपने वर्चुअल कीवर्ड का उपयोग किया है और उस विधि को व्युत्पन्न कक्षा में ओवरराइड करना है जो अन्यथा आपको समय त्रुटि संकलित करेगा। तो मुझे इसका संकलन समय लगता है, वैसे ही जहां मैंने धागे में देखा ..... लेकिन अधिकांश धागे इसके रनटाइम का दावा करते हैं: डी

मैं उलझन में हूं :(यह प्रश्न मेरे प्रश्न 1 और 2 के लिए अतिरिक्त है। .. एक वास्तविक समय उदाहरण के साथ मदद के रूप में मैं सैद्धांतिक परिभाषाओं की पहले से ही जानकारी है .... :(

धन्यवाद ....

+0

यदि मैं आपका प्रश्न बिल्कुल समझता हूं: रन टाइम, आभासी तरीकों को कॉल करना। समय संकलित करें, किसी भी अन्य विधि को बुलाओ। –

+0

उहम्मएम जेफ लेकिन क्या यह सब कुछ है? – Learner

उत्तर

11

ओवरलोडिंग के मामले में, आप स्थैतिक (संकलन-समय) बहुरूपता का उपयोग कर रहे हैं क्योंकि संकलक इस बात से अवगत है कि आप किस विधि को बुला रहे हैं। उदाहरण के लिए:

public static class test 
{ 
    static void Main(string[] args) 
    { 
     Foo(); 
     Foo("test"); 
    } 

    public static void Foo() 
    { 
     Console.WriteLine("No message supplied"); 
    } 

    public static void Foo(string message) 
    { 
     Console.WriteLine(message); 
    } 
} 

इस मामले में, संकलक वास्तव में कौन-फू() विधि हम, बुला रहे हैं पैरामीटर की संख्या/प्रकार के आधार पर जानता है।

ओवरराइडिंग गतिशील (रनटाइम) पॉलीमोर्फिज्म का एक उदाहरण है)। यह इस तथ्य के कारण है कि संकलक को यह नहीं पता कि संकलन समय पर किस प्रकार की वस्तु पारित की जा रही है। मान लीजिए आप एक पुस्तकालय में निम्नलिखित श्रेणियां होती हैं:

public static class MessagePrinter 
{ 
    public static void PrintMessage(IMessage message) 
    { 
     Console.WriteLine(message.GetMessage()); 
    } 
} 

public interface IMessage 
{ 
    public string GetMessage(); 
} 

public class XMLMessage : IMessage 
{ 
    public string GetMessage() 
    { 
     return "This is an XML Message"; 
    } 
} 

public class SOAPMessage : IMessage 
{ 
    public string GetMessage() 
    { 
     return "This is a SOAP Message"; 
    } 
} 

संकलन समय, आप अगर उस समारोह के फोन करने वाले एक XMLMessage, एक SOAPMessage, या संभवतः iMessage का एक और प्रकार कहीं परिभाषित में गुजर रहा है पता नहीं है। जब PrintMessage() फ़ंक्शन कॉल है, यह GetMessage() का कौन सा संस्करण iMessage के प्रकार में पारित हो जाता है के आधार पर क्रम में उपयोग करने के लिए, निर्धारित करता है।

+3

जॉन, मुझे आपके जैसे लोगों के साथ दो चीजों के लिए काम करना चाहिए। 1. कार्य पूरा करने के लिए वास्तविक समय और संतोषजनक रूप से और जुनून के लिए सामान सीखना और भुगतान प्राप्त करना 2. आपके ज्ञान को साझा करने में आपका दृष्टिकोण और सबसे महत्वपूर्ण रूप से इस तरह से जो प्रश्न पूछने वाले लोगों के दिमाग तक पहुंच सकते हैं ... एमएसडीएन के विपरीत ...: (... बहुत धन्यवाद जॉन, आपका उदाहरण बनाया गया मैं इसे समझता हूँ अवधारणा की एक बड़ी सीमा .... हैप्पी :) चीयर्स – Learner

+0

सिर्फ 'फू' की समस्या से गड़बड़ करने के लिए: एक स्थिर वर्ग में इंस्टेंस सदस्यों की घोषणा नहीं कर सकता है, आपकी विधि स्थैतिक होनी चाहिए। – Rahul

+0

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

3

पढ़ें: Polymorphism (C# Programming Guide)

इसी जवाब: Compile Time and run time Polymorphism

ठीक है, दो प्रकार के हैं बहुरूपता जैसा कि नीचे वर्णित:

  • स्टेटिक बहुरूपता (प्रारंभिक बंधन)
  • गतिशील बहुरूपता (देर से बाध्यकारी)

स्टेटिक बहुरूपता (प्रारंभिक बाइंडिंग):

स्टेटिक बहुरूपता यह भी जानते हैं है प्रारंभिक बाध्यकारी और संकलन समय पॉलिमॉर्फिज्म के रूप में। विधि अधिभार और ऑपरेटर ओवरलोडिंग इसके उदाहरण हैं।

इसे प्रारंभिक बाध्यकारी के रूप में जाना जाता है क्योंकि संकलक एक ही नाम के साथ कार्यों के बारे में जानता है और जिसे ओवरलोडेड फ़ंक्शन को संकलित समय में जाना जाता है।

उदाहरण के लिए:

public class Test 
{ 
    public Test() 
    { 

    } 

    public int add(int no1, int no2) 
    { 

    } 

    public int add(int no1, int no2, int no3) 

    { 

    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Test tst = new Test(); 
     int sum = tst.add(10, 20); 

     // here in above statement compiler is aware at compile time that need to call function add(int no1, int no2), hence it is called early binding and it is fixed so called static binding. 
    } 
} 

गतिशील बहुरूपता (लेट बाइंडिंग):

public class Animal 
{ 
    public virtual void MakeSound() 
    { 
     Console.WriteLine("Animal sound"); 
    } 
} 

public class Dog:Animal 
{ 
    public override void MakeSound() 
    { 
     Console.WriteLine("Dog sound"); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Animal an = new Dog(); 
     an.MakeSound();   
     Console.ReadLine(); 
    } 
} 

उपरोक्त कोड में के रूप में, एक आभासी विधि करने के लिए किसी भी अन्य फोन के रूप में, एक के लिए संकलित किया जाएगा कॉलवर्ट आईएल निर्देश। इसका मतलब है कि वास्तविक विधि जिसे कॉल किया जाता है उसे रन-टाइम पर निर्धारित किया जाता है (जब तक कि जेआईटी कुछ विशेष मामले को अनुकूलित नहीं कर सकता), लेकिन संकलक ने जांच की कि विधि मौजूद है, उसने सबसे उपयुक्त ओवरलोड (यदि कोई हो) चुना है और इसकी गारंटी है कि फ़ंक्शन पॉइंटर प्रकार के vtable में एक अच्छी तरह से परिभाषित स्थान पर मौजूद होगा (भले ही यह कार्यान्वयन विवरण हो)। वर्चुअल कॉल को हल करने की प्रक्रिया बेहद तेज़ है (आपको केवल कुछ पॉइंटर्स को हटाना होगा), इसलिए इससे कोई फर्क नहीं पड़ता है।

+0

प्रणय धन्यवाद। लेकिन क्यों केवल जब मैं रनटाइम पर इनपुट मान करता हूं, तो अपने मामले में केवल 2 पैरामीटर कहें, यह विधि को 2 पैरामीटर के साथ कॉल करने का निर्णय लेता है? यह सिर्फ संकलन समय पर संकलित करता है ... आप इसे संकलित समय के रूप में कैसे कॉल कर सकते हैं :(इसका रनटाइम क्योंकि रनटाइम पर केवल इनपुट पर आधारित है, यह उपयुक्त फ़ंक्शन को निकाल देता है .... – Learner

+0

@Divine - इसके comipler time becuase compiler जानता है कि इसे उदाहरण के लिए किस विधि को कॉल करना है उदाहरण के लिए यदि 2 पैरामीटर हैं तो कंपाइलर आसानी से पता लगाता है कि उसे केवल 2 पैरामीटर विधि कॉल करना है ... यदि कॉल को 3 पैरामीटर से 3 गुना करने के लिए ... –

+0

@ दिव्य-कंपाइलर के हस्ताक्षर के बारे में पता है कक्षा के तरीके और इसे आसानी से हल किया जा सकता है ... –

0
public class Animal { 
    public virtual void MakeSound() 
    { 
     Console.WriteLine("Animal sound"); 
    } } 

public class Dog:Animal { 
    public override void MakeSound() 
    { 
     Console.WriteLine("Dog sound"); 
    } } 

class Program { 
    static void Main(string[] args) 
    { 
     Animal an = new Dog(); 
     an.MakeSound();   
     Console.ReadLine(); 
    } } 

इस गतिशील बहुरूपता है, क्योंकि यह निर्णय लिया गया है रनटाइम जिसे मेकसाउंड का संस्करण माता-पिता या बच्चे के रूप में बुलाया जाएगा, क्योंकि कोई बच्चा पैरेंट फ़ंक्शन को ओवरराइड नहीं कर सकता है या इसे ओवरराइड कर सकता है लेकिन यह सब रनटाइम पर तय किया जाता है, जिसे संस्करण कहा जाता है ....

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