2009-03-16 25 views
7

Tôi không nói về các lớp chung chung khai báo các thuộc tính hoặc các trường với kiểu tham số chung. Tôi đang nói về các thuộc tính chung chung có thể được áp dụng cho cả hai lớp chung chung và không chung chung.Bạn có nghĩ các thuộc tính chung sẽ hữu ích trong .NET không?

Tôi không nói về vấn đề này:

public class Base<T> 
{ 
    public T BaseProperty { get; set; } 
} 

Tôi đang nói về điều này:

public class Base 
{ 
    public T BaseProperty<T> 
    { 
     get 
     { 
      // Insert magic 
     } 
     set 
     { 
      // Insert magic 
     } 
    } 
} 

Hoặc này:

public class Base<U> 
{ 
    public T BaseProperty<T> 
    { 
     get 
     { 
      // Insert magic 
     } 
     set 
     { 
      // Insert magic 
     } 
    } 

    public U OtherBaseProperty { get; set; } 
} 

Việc sử dụng sẽ đi một cái gì đó như thế này :

var b = new Base(); 
b.BaseProperty<int> = 42; 
int i = b.BaseProperty<int>; 
b.BaseProperty<string> = "Hi"; 
string s = b.BaseProperty<string>; 

Hoặc cho ví dụ thứ hai:

var b = new Base<string>(); 
b.BaseProperty<int> = 42; 
int i = b.BaseProperty<int>; 
b.OtherBaseProperty = "Hi"; 
string s = b.OtherBaseProperty; 

Các // Chèn ma thuật dùng để xử lý mỗi cuộc gọi đến các getter tài sản chung hoặc setter mà có một kiểu khác nhau cho các tham số kiểu.

Ví dụ này:

b.BaseProperty<int> = 42; 

nhu cầu được xử lý khác nhau để:

b.BaseProperty<string> = "Hi"; 

tôi sẽ dự tính rằng đối với từng loại T nếu getter được gọi trước khi setter được gọi sau đó mặc định (T) được trả về. Khi setter được gọi là giá trị được lưu trữ trên mỗi loại T sao cho khi getter được gọi là giá trị trước đó đã được thiết lập cho kiểu đó được trả về.

Lưu ý rằng trong các thuộc tính trình bao chỉ là các phương thức.

Bạn có nghĩ điều này hữu ích không?

+0

Không, dường như tất cả đều không hữu ích. Nếu tôi cần một tài sản int, tôi sẽ làm một cái. Nếu tôi cần một tài sản chuỗi, tôi sẽ làm một cái. Khá đơn giản. –

Trả lời

10

Tôi đã có một vài lần mà tôi có thể thích khả năng thực hiện việc này, vâng.

Tuy nhiên, cú pháp liên quan sẽ khá xấu xí, và nó hiếm khi hữu ích mà tôi nghĩ rằng tôi thích chỉ hút nó lên và đi với các phương pháp chung chung.

+0

Thật vậy, đã có một hoặc hai lần khi nó sẽ có ích. Tôi hỏi Mads Torgersen @ MS về việc này một lần và về cơ bản anh ấy nói, "Tại sao bạn lại muốn làm điều đó?" Nói cách khác, các trường hợp cạnh không đủ hấp dẫn. – core

+0

Các loại tài sản có thể được thực hiện bằng cách sử dụng các đặc điểm: http://scg.unibe.ch/Research/Rotor/index.html, thật không may cho. Net họ không bao giờ làm cho nó ra khỏi nghiên cứu ... –

+0

Cảm ơn Jon. Tôi rất thích cuốn sách của bạn. Tôi đã đọc về generics đêm qua và đã có ý tưởng này. –

1

Không có trường hợp sử dụng kẻ giết người, không. Bạn có thể đã đạt được điều tương tự với một cặp phương pháp chung, nếu bạn cần nó.

0

Nếu vì một số lý do kỳ lạ bạn quyết định bạn muốn có nó, bạn có thể sắp xếp các giả nó với các phương pháp:

public class Thing 
{ 
    Dictionary<Type, object> xDict = new Dictionary<Type,object>(); 
    public void set_X<T>(T x) 
    { 
     xDict[typeof(T)] = x; 
    } 
    public T get_X<T>() 
    { 
     return (T)xDict[typeof(T)]; 
    } 
} 

Tại sao bạn sẽ muốn là một vấn đề hoàn toàn khác nhau, mặc dù. Nó thường có ý nghĩa hơn để bắt đầu với một cái gì đó bạn muốn làm hơn một số cách bạn muốn làm điều đó.

1

No.

Phương pháp chung có ý nghĩa, bởi vì chúng thể hiện một số hoạt động chung có thể được áp dụng hợp lý cho các loại khác nhau.

Nhưng các thuộc tính chỉ có ý nghĩa như các giá trị được đặt tên duy nhất có nội dung xác định. 'Các thuộc tính chung', giống như bạn đề xuất, thực sự chỉ là các thuộc tính được đặt tên giống với chữ ký khác và nội dung khác nhau.

1

Đây là một ví dụ mà nó sẽ thuận tiện cho tôi, nếu có thể.

var settings = new Settings(); 
int timeout = settings<int>["CacheInMinutes"]; 

Nơi cài đặt tải tệp XML của biến cấu hình.

đó, so với:

var settings = new Settings(); 
int timeout = int.Parse(settings["CacheInMinutes"]); 

Thực sự không nhiều sự khác biệt, nhưng hey, tôi vẫn có vẻ rất muốn indexer generic.

+0

Có nhưng "int timeout = settings.Get (" CacheInMinutes ");" chỉ là terse và không yêu cầu thay đổi/bổ sung ngôn ngữ để triển khai. – Chris

+0

Tốt nhất. Những người lập chỉ mục trông giống như một trường hợp sử dụng tốt: Phiên ["Người dùng hiện tại"] = Người dùng mới(); ... var người dùng = Phiên ["Người dùng hiện tại"]; –

1

tốt, tôi có tình huống cần chung tài sản trong lớp không chung chung.

Ví dụ bạn có IComponent lớp muốn cung cấp cho cha mẹ IContainer với thuộc tính Parent, vì thành phần này có thể thuộc về bất kỳ loại vùng chứa nào. vì vậy bạn cần phải cung cấp tài sản chung chứ không phải là phương pháp chung

Component c = new Component(); 
Container p = new Container(); 
p.Add(c); 

và sau đó bạn truy cập vào mẹ của nó sử dụng tài sản chung (không aplicable nay)

c.Parent.ContainerProperty; 
c.Parent.ContainerMethod(); 

thay vì sử dụng phương pháp tiết như

c.Parent().ContainerProperty; 
c.Parent().ContainerMethod(); 

Vâng, trong trường hợp này tài sản chung chung là đẹp hơn và có ý nghĩa, vì bạn không cần phải nhập bất kỳ đối số.

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