Kalıtım, Nitelikler için nasıl çalışır?


108

InheritedÖzniteliklerdeki bool özelliği neyi ifade eder?

Sınıfımı bir öznitelikle AbcAtribute(sahip olan Inherited = true) tanımlarsam ve bu sınıftan başka bir sınıfı miras alırsam, türetilmiş sınıfta da aynı özniteliğin uygulanacağı anlamına mı gelir?

Bu soruyu bir kod örneği ile açıklığa kavuşturmak için şunları hayal edin:

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

[Random]
class Mother 
{ }

class Child : Mother 
{ }

Does Childda var Randomuygulanmış niteliğini?


3
Eğer soru soruldu zaman böyle değildi, ama bugün resmi belgeler Inheritedözelliği ayrıntılı bir örnek vardır gösterileri arasındaki fark Inherited=trueve Inherited=falsekalıtsal bir sınıf ve bir ikisi için overrideyöntemiyle.
Jeppe Stig Nielsen

Yanıtlar:


117

Devralındı ​​= true (varsayılan değerdir) olduğunda, bu, oluşturduğunuz özniteliğin öznitelikle dekore edilmiş sınıfın alt sınıfları tarafından miras alınabileceği anlamına gelir.

Yani - MyUberAttribute'u [AttributeUsage (Inherited = true)] ile oluşturursanız

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

Sonra bir süper sınıfı süsleyerek Özniteliği kullanın ...

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

MySuperClass'ın bir alt sınıfını oluşturursak, bu niteliğe sahip olacaktır ...

class MySubClass : MySuperClass
{
   ...
}

Ardından bir MySubClass örneği oluşturun ...

MySubClass MySubClassInstance = new MySubClass();

Ardından, özelliğe sahip olup olmadığını test edin ...

MySubClassInstance <--- artık ÖzelAdı değeri "Bob" olan MyUberAttribute'a sahip.


21
Öznitelik devralmanın varsayılan olarak etkinleştirildiğini lütfen unutmayın.
Corstian BOERMAN

14

Evet, tam olarak anlamı budur. Öznitelik

[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

Öznitelik devralma varsayılan olarak etkindir.

Bu davranışı şu şekilde değiştirebilirsiniz:

[AttributeUsage (Inherited = False)]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.