जिराफ कब जिराफ नहीं है?


23

मुझे उम्मीद है कि इस तरह की "पहेली" प्रोग्रामिंग पहेलियाँ और कोड गोल्फ में ऑनटॉपिक है।

ऐसी स्थिति का उदाहरण दें जहां C # विधि रिटर्न केfalse नीचे है :

public class Giraffe : Animal
{
  public bool Test()
  {
    return this is Giraffe;
  }
}

नियम: ऊपर दी गई कोड लाइनें किसी भी तरह से नहीं बदली जानी चाहिए, लेकिन आप कोड को एक एप्लिकेशन में डाल देंगे ताकि "प्रोजेक्ट" संकलित हो और विधि को कॉल किया जाए। जब चलाते हैं, तो विधि लौटना चाहिए false। मेरे मन में जो समाधान है, वह रन-टाइम या इसी तरह की "विदेशी" चीजों पर अपने आईएल का उत्सर्जन नहीं करता है, यह एक सामान्य उदाहरण विधि कॉल है।


2
"विधि कहा जाता है" से, क्या आपके कहने का मतलब यह है कि किसी तरह घटित Giraffe giraffe = new Giraffe(); giraffe.Test(); होना चाहिए ताकि उस विधि की रेखा वास्तव में निष्पादित हो जाए?
जेसी सी। स्लाइसर

@ JesseC.Slicer हां, मेरे पास जो समाधान है, वह लाइन में है। बेशक, अन्य समाधानों को देखना दिलचस्प हो सकता है जिनके बारे में मैंने नहीं सोचा था। तो अगर आपके पास कुछ है, तो इसे पोस्ट करें!
जेपी स्टिग नील्सन

1
खैर, मेरा सरल समाधान अधिक पसंद है Animal giraffe = new Giraffe(); giraffe.Test();और मूल वर्ग Animalमें एक Test()विधि है जो वापस आती है false। यह थोड़ा धोखा दे रहा है क्योंकि यह मूल वर्ग विधि को कॉल करने के बजाय है Giraffe। लेकिन कॉल साइट एक ही लगती है।
जेसी सी। स्लीकर

@ JesseC.Slicer आह, मैं देख रहा हूं। मेरा तर्क है कि आपके "समाधान" के साथ यह "नीचे की विधि" नहीं है (जैसा कि मेरी समस्या में कहा गया है) यह रिटर्न देता है false, इसलिए मैं यह नहीं कहूंगा कि यह एक पूर्ण समाधान था। लेकिन फिर भी दिलचस्प है। मेरे समाधान में कोई भी विधि छिपाना (संकेत) नहीं है, लेकिन जैसा कि मैंने कहा, अन्य समाधान भी दिलचस्प हो सकते हैं।
जेपी स्टिग नीलसन

जवाबों:


28

हाँ, यह मिल गया!

public class Animal
{
    public class Giraffe { } // 1
}
public class Giraffe : Animal // 2
{
    public bool Test()
    {
        return this is Giraffe;
    }
}

चूंकि Giraffe 1एक सदस्य है Animal, और Giraffe 2आगे एक स्तर है, Giraffeइसलिए isपरीक्षण में नाम पूर्व को संदर्भित करता है (सी # # अन्य क्रम में धारा 7.6.2)।

दृश्य स्टूडियो के लिए एक चेतावनी दिखाता है this is Giraffe:

दी गई अभिव्यक्ति कभी भी उपलब्ध प्रकार की नहीं है

जो स्पष्ट रूप से सच है, क्योंकि यह पूरी बात है :)

आप Giraffe 1सीधे अंदर नहीं डाल सकते Giraffe 2, क्योंकि

सदस्य नाम उनके संलग्न प्रकार के समान नहीं हो सकते

- लेकिन व्युत्पन्न वर्गों के लिए ऐसा नियम मौजूद नहीं है।

नीट की समस्या, मुझे थोड़ी देर लगी।


11
खैर खेला साहब
मार्क Gravell

2
हां, मेरे मन में इसका समाधान था! तो दो प्रकार के होते हैं, एक नेस्टेड TheNamespace.Animal.Giraffeजिसके कारण वंशानुक्रम भी कहा जा सकता है TheNamespace.Giraffe.Giraffe, और एक गैर-नेस्टेड TheNamespace.Giraffe। C # युक्ति का आपका संदर्भ प्रासंगिक है! आप संकलक चेतावनी से छुटकारा पा सकते हैं। बस आधार वर्ग के नेस्टेड प्रकार को बदल classदें interface। उस मामले में कोई गैर-नेस्टेड से आगे निकल सकता है Giraffe और नेस्टेड Giraffeको भी लागू कर सकता है, इसलिए उस मामले में कंपाइलर शिकायत नहीं कर सकता है; यह एक "निष्पक्ष" प्रकार की जाँच है।
जेपी स्टिग नीलसन

1
मुझे यह समाधान समझ में नहीं आता है - ऐसा इसलिए हो सकता है क्योंकि मैं C # ज्यादा नहीं जानता। मुझे यह नामों पर खेलना पसंद नहीं है। मैं @ JesseC.Slicer के समाधान को बहुत चालाक समझता हूं।
निकोलस बारबुलेसको
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.