2010-02-24 38 views
7

Tôi sử dụng Height cho tất cả các thành viên Foo. Như thế nàyTruy cập thuộc tính tĩnh của lớp chung?

public class Foo<T> 
{ 
    public static int FoosHeight; 
} 

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     Foo<???>.FoosHeight = 50; // DO I Set "object" here? 
    } 
} 

Tình huống tương tự cũng xảy ra trong VB.NET.

+1

Aargh! Đôi mắt của tôi! –

+2

Điều gì là sai với đôi mắt của bạn? – serhio

Trả lời

13

Bạn sẽ phải đặt một số thông số loại chung trong đó. Điều đó đang được nói, đôi khi tôi sẽ sử dụng một số loại kế hoạch thừa kế để có được chức năng này mà không cần phải đưa vào tham số kiểu chung chung.

public class Foo 
{ 
    public static int FoosHeight; 
} 

public class Foo<T> : Foo 
{ 
    // whatever 
} 

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     Foo.FoosHeight = 50; // DO I Set "object" here? 
    } 
} 

Điều đó đang được nói, điều này sẽ giữ nguyên FoosHeight bất kể thông số loại chung được chuyển thành Foo<T>. Nếu bạn muốn có một giá trị khác nhau cho mỗi phiên bản Foo<T>, bạn sẽ phải chọn một loại để đặt vào thông số loại đó và quên lược đồ thừa kế.

+0

Tôi cho rằng, giải pháp tương tự cũng hoạt động trong VB.NET? – serhio

+0

Có, nó nên. Cùng một ý tưởng chung, chỉ cần viết lại nó trong VB.NET. Bất kỳ trình chuyển đổi mã trực tuyến nào cũng nên thực hiện thủ thuật. –

2

Mỗi loại chung chung cụ thể là loại riêng của nó và do đó có biến tĩnh riêng của nó. Vì vậy, Foo<int> sẽ có thành viên chiều cao tĩnh khác với Foo<string>. Nếu bạn muốn chia sẻ với tất cả các loại Foo<T> cụ thể, bạn cần triển khai điều đó ở một nơi khác.

Nếu bạn thực sự chỉ muốn đặt giá trị cho loại Foo<object>, hơn chỉ là: Foo<object>.

+0

Tôi cho rằng tình huống tương tự sẽ xảy ra với Foo , ý tôi là Foo sẽ khác với Foo serhio

+0

đúng. Đó là một thực thể khác trong hệ thống kiểu. –

7

Bạn cần phải xác định một loại, chẳng hạn như

Foo<int>.FoosHeight = 50; 

hoặc

Foo<Bar>.FoosHeight = 50; 

nhưng mỗi tách biệt. Foo<int>.FoosHeight không liên quan đến Foo<Bar>.FoosHeight. Chúng có hiệu quả hai lớp riêng biệt với hai trường tĩnh riêng biệt. Nếu bạn muốn giá trị là giống nhau cho tất cả Foo <> sau đó bạn cần một nơi riêng biệt để lưu trữ nó như

FooHelper.FoosHeight = 50; 

Và FooHelper không có mối quan hệ chính thức với Foo <>.

+0

Giải thích rất tốt. –

Các vấn đề liên quan