उत्तराधिकार के लिए विरासत कैसे काम करती है?


108

Inheritedविशेषताओं पर बूल संपत्ति का क्या मतलब है?

क्या इसका मतलब यह है कि अगर मैं अपनी कक्षा को एक विशेषता AbcAtribute(जो है Inherited = true) के साथ परिभाषित करता हूं , और अगर मुझे उस वर्ग से दूसरी कक्षा विरासत में मिलती है, तो व्युत्पन्न वर्ग में भी वही विशेषता होगी जो उस पर लागू होती है?

एक कोड उदाहरण के साथ इस प्रश्न को स्पष्ट करने के लिए, निम्नलिखित की कल्पना करें:

[AttributeUsage(AttributeTargets.Class, Inherited = true)]
public class Random: Attribute
{ /* attribute logic here */ }

[Random]
class Mother 
{ }

class Child : Mother 
{ }

क्या Childइसके लिए Randomविशेषता भी लागू होती है?


3
जब आप सवाल पूछते थे, तो ऐसा नहीं होता था, लेकिन आज संपत्ति के आधिकारिक दस्तावेजInherited में एक विस्तृत उदाहरण है, जो विरासत में मिले वर्ग और एक विधि दोनों के बीच Inherited=trueऔर उनके बीच के अंतर को दर्शाता है । Inherited=falseoverride
जेपी स्टिग नील्सन

जवाबों:


117

जब Inherited = true (जो डिफ़ॉल्ट है) तो इसका मतलब है कि आपके द्वारा बनाई जा रही विशेषता को विशेषता द्वारा सुशोभित वर्ग के उप-वर्गों द्वारा विरासत में मिला जा सकता है।

इसलिए - यदि आप MyUberAttribute को [AttributeUsage (Inherited = true)] के साथ बनाते हैं

[AttributeUsage (Inherited = True)]
MyUberAttribute : Attribute
{
   string _SpecialName;
   public string SpecialName
   { 
     get { return _SpecialName; }
     set { _SpecialName = value; }
   }
}

फिर सुपर क्लास लगाकर अट्रैक्शन का इस्तेमाल करें ...

[MyUberAttribute(SpecialName = "Bob")]
class MySuperClass 
{
  public void DoInterestingStuf () { ... }
}

यदि हम MySuperClass का एक उप-वर्ग बनाते हैं, तो यह विशेषता होगी ...

class MySubClass : MySuperClass
{
   ...
}

फिर MySubClass की एक आवृत्ति को त्वरित करें ...

MySubClass MySubClassInstance = new MySubClass();

फिर देखें कि क्या इसकी विशेषता है ...

MySubClassInstance <--- अब "बॉब" के साथ MyNberAttribute को SpecialName मान के रूप में है।


21
कृपया ध्यान दें कि विशेषता उत्तराधिकार डिफ़ॉल्ट रूप से सक्षम है।
Corstian Boerman

14

हाँ, इसका ठीक यही अर्थ है। गुण

[AttributeUsage(Inherited=true)]
public class FooAttribute : System.Attribute
{
    private string name;

    public FooAttribute(string name)
    {
        this.name = name;
    }

    public override string ToString() { return this.name; }
}

[Foo("hello")]
public class BaseClass {}

public class SubClass : BaseClass {}

// outputs "hello"
Console.WriteLine(typeof(SubClass).GetCustomAttributes(true).First());

2

डिफ़ॉल्ट रूप से विशेषता विरासत को सक्षम किया गया है।

आप इस व्यवहार को बदल सकते हैं:

[AttributeUsage (Inherited = False)]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.