Kế thừa hoạt động như thế nào đối với Thuộc tính?


108

Inheritedsở hữu bool trên thuộc tính đề cập đến?

Có nghĩa là nếu tôi xác định lớp của mình bằng một thuộc tính AbcAtribute(có Inherited = true) và nếu tôi kế thừa một lớp khác từ lớp đó, thì lớp dẫn xuất cũng sẽ có cùng thuộc tính đó được áp dụng cho nó?

Để làm rõ câu hỏi này với một ví dụ mã, hãy tưởng tượng như sau:

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

[Random]
class Mother 
{ }

class Child : Mother 
{ }

Liệu Childcòn có Randomthuộc tính áp dụng cho nó?


3
Đó không phải là trường hợp bạn đặt câu hỏi, nhưng hôm nay tài liệu chính thức về thuộc Inheritedtính có một ví dụ cụ thể cho thấy sự khác biệt giữa Inherited=trueInherited=falseđối với cả lớp kế thừa và một overridephương thức.
Jeppe Stig Nielsen

Câu trả lời:


117

Khi Inhe inherit = true (là mặc định) có nghĩa là thuộc tính bạn đang tạo có thể được kế thừa bởi các lớp con của lớp được trang trí bởi thuộc tính.

Vì vậy - nếu bạn tạo MyUberAttribute với [AttributeUsage (Inhe inherit = true)]

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

Sau đó, sử dụng Thuộc tính bằng cách trang trí một ...

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

Nếu chúng ta tạo một lớp con của MySuperClass, nó sẽ có thuộc tính này ...

class MySubClass : MySuperClass
{
   ...
}

Sau đó, khởi tạo một phiên bản của MySubClass ...

MySubClass MySubClassInstance = new MySubClass();

Sau đó kiểm tra xem nó có thuộc tính ...

MySubClassInstance <--- bây giờ có MyUberAttribute với "Bob" là giá trị SpecialName.


21
Xin lưu ý rằng kế thừa thuộc tính được bật theo mặc định.
Corstian Boerman

14

Vâng, đó chính là ý nghĩa của nó. Thuộc tính

[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

Kế thừa thuộc tính được bật theo mặc định.

Bạn có thể thay đổi hành vi này bằng cách:

[AttributeUsage (Inherited = False)]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.