2009-08-06 31 views
82

Thuộc tính bool Inherited thuộc tính đề cập đến là gì?Tính kế thừa hoạt động như thế nào đối với Thuộc tính?

Điều đó có nghĩa là nếu tôi xác định lớp của mình với 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õ vấn đề này với một ví dụ mã, 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 Child cũng có thuộc tính Random áp dụng cho nó?

+0

Đó không phải là trường hợp bạn đặt câu hỏi, nhưng hôm nay là [tài liệu chính thức của thuộc tính 'Inherited'] (https://msdn.microsoft.com/en-us/library/system.attributeusageattribute.inherited. aspx) có một ví dụ phức tạp cho thấy sự khác biệt giữa 'Inherited = true' và' Inherited = false' cho cả lớp thừa kế và phương thức 'override'. –

Trả lời

88

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

Vì vậy, - nếu bạn tạo MyUberAttribute với [AttributeUsage (Kế thừa = true)]

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

Sau đó sử dụng các thuộc tính bằng cách trang trí một siêu lớp ...

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

Nếu chúng ta tạo ra một sub-class của MySuperClass nó sẽ có thuộc tính này ...

class MySubClass : MySuperClass 
{ 
    ... 
} 

Sau đó khởi tạo một instanc e của MySubClass ...

MySubClass MySubClassInstance = new MySubClass(); 

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

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

+12

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

12

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

[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()); 
Các vấn đề liên quan