การสืบทอดทำงานอย่างไรสำหรับแอตทริบิวต์?


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=falseสำหรับทั้งคลาสที่สืบทอดและoverrideวิธีการ
Jeppe Stig Nielsen

คำตอบ:


117

เมื่อ Inherited = true (ซึ่งเป็นค่าเริ่มต้น) หมายความว่าแอตทริบิวต์ที่คุณกำลังสร้างสามารถสืบทอดโดยคลาสย่อยของคลาสที่ตกแต่งโดยแอตทริบิวต์

ดังนั้น - หากคุณสร้าง MyUberAttribute ด้วย [AttributeUsage (Inherited = true)]

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

จากนั้นใช้ Attribute โดยตกแต่ง super-class ...

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

ถ้าเราสร้างคลาสย่อยของ MySuperClass มันจะมีแอตทริบิวต์นี้ ...

class MySubClass : MySuperClass
{
   ...
}

จากนั้นสร้างอินสแตนซ์ของ MySubClass ...

MySubClass MySubClassInstance = new MySubClass();

จากนั้นทดสอบดูว่ามีแอตทริบิวต์ ...

MySubClassInstance <--- ตอนนี้มี MyUberAttribute ที่มี "Bob" เป็นค่า 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)]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.