सुंदर प्रश्न! मैं उन लोगों के लिए थोड़ा लंबा स्पष्टीकरण जोड़ना चाहता हूं जो दैनिक आधार पर सी # नहीं करते हैं ... क्योंकि सवाल सामान्य रूप से नाम समाधान के मुद्दों का एक अच्छा अनुस्मारक है।
मूल कोड लो, निम्नलिखित तरीकों से थोड़ा संशोधित:
- मूल अभिव्यक्ति (यानी
return this is Sparta
) के रूप में उनकी तुलना करने के बजाय टाइप नामों को प्रिंट करें ।
- चलो इंटरफेस को परिभाषित
Athena
में Place
इंटरफेस नाम संकल्प वर्णन करने के लिए सुपर-क्लास।
- चलो यह भी पता करें
this
कि Sparta
कक्षा में किस प्रकार का नाम है , बस सब कुछ बहुत स्पष्ट करने के लिए।
कोड इस तरह दिखता है:
public class Place {
public interface Athena { }
}
public class Sparta : Place
{
public void printTypeOfThis()
{
Console.WriteLine (this.GetType().Name);
}
public void printTypeOfSparta()
{
Console.WriteLine (typeof(Sparta));
}
public void printTypeOfAthena()
{
Console.WriteLine (typeof(Athena));
}
}
अब हम एक Sparta
ऑब्जेक्ट बनाते हैं और तीन तरीकों को कॉल करते हैं।
public static void Main(string[] args)
{
Sparta s = new Sparta();
s.printTypeOfThis();
s.printTypeOfSparta();
s.printTypeOfAthena();
}
}
हमें जो आउटपुट मिलता है वह है:
Sparta
Athena
Place+Athena
हालाँकि, अगर हम प्लेस क्लास को संशोधित करते हैं और इंटरफ़ेस स्पार्टा को परिभाषित करते हैं:
public class Place {
public interface Athena { }
public interface Sparta { }
}
इसके बाद यह है Sparta
- इंटरफ़ेस - जो नाम लुकअप मैकेनिज्म के लिए सबसे पहले उपलब्ध होगा और हमारे कोड का आउटपुट बदल जाएगा:
Sparta
Place+Sparta
Place+Athena
इसलिए हमने MakeItReturnFalse
सुपरक्लास में स्पार्टा इंटरफेस को परिभाषित करके फ़ंक्शन परिभाषा में टाइप तुलना के साथ प्रभावी रूप से गड़बड़ कर दिया है , जो कि नाम रिज़ॉल्यूशन द्वारा पहले पाया गया है।
लेकिन नाम प्रस्ताव में सुपरक्लास में परिभाषित इंटरफेस को प्राथमिकता देने के लिए C # को क्यों चुना गया? @JonSkeet को पता है! और यदि आप उसका उत्तर पढ़ते हैं तो आपको C # में नाम रिज़ॉल्यूशन प्रोटोकॉल का विवरण मिलेगा।