2011-05-01 40 views
34

Trong lớp cơ sở abstract nếu chúng ta có một số trường static thì điều gì xảy ra với chúng?Trường tĩnh trong lớp cơ sở và các lớp dẫn xuất

Phạm vi của chúng là các lớp kế thừa từ lớp cơ sở này hay chỉ loại mà nó kế thừa (mỗi phân lớp có bản sao riêng của trường static từ lớp cơ sở abstract)?

+0

BTW, thực tế là lớp cơ sở là 'abstract' là một cá trích đỏ; nó không quan trọng nếu lớp cơ sở là 'abstract' hay không, hành vi @Marc Gravell chỉ ra là giống nhau. – casperOne

+0

@casperOne: Tôi đang tìm một cái gì đó như 'TypeLocal ' vì chúng ta có 'ThreadLocal ' vì vậy bất kỳ đối tượng nào của kiểu đó sẽ là 'static' trong nó tương ứng' subclass'. – Xaqron

Trả lời

54

static thành viên hoàn toàn cụ thể cho các số tuyên bố lớp học; các lớp con không nhận được các bản sao riêng biệt. Ngoại lệ duy nhất ở đây là generics; nếu một kiểu generic mở khai báo các trường tĩnh, trường cụ thể cho chính xác kết hợp đối số kiểu này tạo nên loại chung đóng; tức là Foo<int> sẽ có các trường tĩnh riêng biệt để Foo<string>, giả sử các trường được xác định trên Foo<T>.

+0

@Marc Gravell: Xin lỗi người đàn ông, bạn và @Jon Skeet đã dạy tôi là người khổng lồ; bạn có nghĩa là để nói "loại đối số" như trái ngược với "đối số tĩnh". =) Hy vọng tất cả là tốt trên ao. – casperOne

+2

Cách khai báo một biến duy nhất cho tất cả các cá thể (mỗi loại) từ 'lớp cơ sở'? – Xaqron

+0

@Xaqron: Bạn không thể, bạn sẽ phải redeclare thành viên tĩnh bạn muốn trên mỗi lớp dẫn xuất. – casperOne

8

Như được chỉ ra trong câu trả lời khác, trường tĩnh lớp cơ sở sẽ được chia sẻ giữa tất cả các lớp con. Nếu bạn cần một bản sao riêng cho từng phân lớp cuối cùng, bạn có thể sử dụng từ điển tĩnh có tên lớp con làm khóa:

class Base 
{ 
    private static Dictionary<string, int> myStaticFieldDict = new Dictionary<string, int>(); 

    public int MyStaticField 
    { 
     get 
     { 
      return myStaticFieldDict.ContainsKey(this.GetType().Name) 
        ? myStaticFieldDict[this.GetType().Name] 
        : default(int); 
     } 

     set 
     { 
      myStaticFieldDict[this.GetType().Name] = value; 
     } 
    } 

    void MyMethod() 
    { 
     MyStaticField = 42; 
    } 
} 
Các vấn đề liên quan