c# - यह स्पार्टा है, या यह है?




inheritance types (2)

लेकिन MakeItReturnFalse() {namespace}.Place.Sparta बजाय {namespace}.Place.Sparta उल्लेख क्यों करता है?

असल में, क्योंकि यही नाम देखने के नियम कहते हैं। C # 5 विनिर्देश में, संबंधित नामकरण नियम धारा 3.8 ("नाम और प्रकार के नाम") में हैं।

गोलियों की पहली जोड़ी - काट-छाँट और तोड़फोड़ - पढ़ें:

  • यदि नामस्थान-या-प्रकार का नाम I या I<A1, ..., AK> [so K = 0 हमारे फॉर्म में है]
    • यदि K शून्य है और नाम-स्थान-या-प्रकार का नाम एक सामान्य विधि घोषणा के भीतर दिखाई देता है [नहीं, कोई सामान्य तरीके नहीं]
    • अन्यथा, यदि नामस्थान-या-प्रकार-नाम एक प्रकार की घोषणा के भीतर प्रकट होता है, तो प्रत्येक उदाहरण के लिए T ()10.3.1), उस प्रकार के उदाहरण के प्रकार से शुरू होता है और प्रत्येक संलग्न वर्ग के उदाहरण प्रकार के साथ जारी रहता है या संरचना की घोषणा (यदि कोई हो):
      • यदि K शून्य है और T की घोषणा में I नाम के साथ एक प्रकार का पैरामीटर शामिल है, तो नाम-स्थान या प्रकार-नाम उस प्रकार के पैरामीटर को संदर्भित करता है। [नहीं]
      • अन्यथा, यदि नाम स्थान-या-प्रकार का नाम प्रकार की घोषणा के शरीर के भीतर प्रकट होता है, और T या इसके किसी भी प्रकार के आधार में एक नेस्टेड सुलभ प्रकार होता है जिसका नाम I और K प्रकार पैरामीटर होता है, तो नाम-स्थान-या-प्रकार का नाम उस प्रकार को संदर्भित करता है जो दिए गए प्रकार के तर्कों के साथ निर्मित होता है। [बिंगो!]
  • यदि पिछले चरण असफल रहे थे, तो प्रत्येक नामस्थान N , उन नामस्थानों से शुरू होता है जिनमें नामस्थान-या-प्रकार-नाम होता है, प्रत्येक संलग्न नामस्थान (यदि कोई हो) के साथ जारी रहता है, और वैश्विक नामस्थान के साथ समाप्त होता है, तो निम्न चरण हैं एक इकाई स्थित होने तक मूल्यांकन किया जाता है:
    • यदि K शून्य है और I N में एक नाम स्थान का नाम I , तो ... [हां, यह सफल होगा ]

ताकि अंतिम गोली बिंदु वह हो जो Sparta वर्ग को उठाता है यदि पहली गोली कुछ भी नहीं ढूंढती है ... लेकिन जब बेस क्लास Place एक इंटरफ़ेस Sparta को परिभाषित करता है, तो Sparta वर्ग पर विचार करने से पहले यह मिल जाता है।

ध्यान दें कि यदि आप नेस्टेड टाइप को बनाते हैं। किसी स्थान पर इंटरफ़ेस के बजाय Place.Sparta को वर्ग बनाता है, तो यह अभी भी संकलित करता है और false रिटर्न करता है - लेकिन कंपाइलर एक चेतावनी जारी करता है क्योंकि यह जानता है कि Sparta का एक उदाहरण कभी भी क्लास Place.Sparta का उदाहरण नहीं होगा। । इसी तरह यदि आप Place.Sparta एक इंटरफ़ेस रखते हैं लेकिन Sparta क्लास को sealed , तो आपको एक चेतावनी मिल जाएगी क्योंकि कोई Sparta उदाहरण कभी भी इंटरफ़ेस को लागू नहीं कर सकता है।

निम्नलिखित एक साक्षात्कार प्रश्न है। मैं एक समाधान के साथ आया था, लेकिन मुझे यकीन नहीं है कि यह क्यों काम करता है।

सवाल:

Sparta क्लास को संशोधित किए बिना, कुछ कोड लिखें जो MakeItReturnFalse false बनाता है।

public class Sparta : Place
{
    public bool MakeItReturnFalse()
    {
        return this is Sparta;
    }
}

मेरा समाधान: (SPOILER)

public class Place
{
public interface Sparta { }
}

लेकिन MakeItReturnFalse() {namespace}.Place.Sparta बजाय {namespace}.Place.Sparta उल्लेख क्यों करता है?


जब किसी नाम को उसके मान के लिए हल किया जाता है तो परिभाषा की "निकटता" का उपयोग अस्पष्टताओं को हल करने के लिए किया जाता है। जो भी परिभाषा "निकटतम" है वही चुना जाता है।

इंटरफ़ेस Sparta को बेस क्लास के भीतर परिभाषित किया गया है। वर्ग Sparta को नामस्थान में परिभाषित किया गया है। बेस क्लास के भीतर परिभाषित चीजें समान नामस्थान में परिभाषित चीजों की तुलना में "करीब" हैं।





namespaces