2010-05-28 39 views
5

Tôi đang tìm cách tạo một trình bao bọc chung cho bất kỳ đối tượng nào.
Đối tượng bao bọc sẽ hoạt động giống như lớp kết thúc tốt đẹp, nhưng sẽ có thể có nhiều thuộc tính, biến, phương thức, v.v., ví dụ: đối tượng đếm, bộ nhớ đệm, vvTrình bao bọc C# cho các đối tượng

Say lớp wrapper được gọi Wrapper, và lớp được bao bọc được gọi là Quảng trường và có constructor Square (edge_len kép) và các thuộc tính/phương pháp EdgeLengthDiện tích, tôi muốn sử dụng nó như sau:

Wrapper<Square> mySquare = new Wrapper<Square>(2.5); /* or */ new Square(2.5); 
Console.Write("Edge {0} -> Area {1}", mySquare.EdgeLength, mySquare.Area); 

Rõ ràng tôi có thể tạo ra như một lớp wrapper cho mỗi lớp tôi muốn quấn, nhưng tôi đang tìm một giải pháp chung, i. e. Wrapper<T> có thể xử lý cả hai loại nguyên thủy và hợp chất (mặc dù trong tình huống hiện tại của tôi, tôi sẽ rất vui khi chỉ gói các lớp của riêng mình).

Đề xuất?

Cảm ơn.

+0

Bạn không thể thực hiện việc này với C# lên tới 3.0. Phiên bản 4.0, tuy nhiên, có thể cho phép bạn làm điều này thông qua hệ thống kiểu động mới. –

+0

Bạn có thể vui lòng xây dựng? Cảm ơn. – Haggai

Trả lời

2

DynamicProxy từ dự án Castle có thể là giải pháp cho bạn.

+1

1, có - câu hỏi rõ ràng là tìm kiếm một thực hiện proxy. DynamicProxy được sử dụng rộng rãi trong thế giới mã nguồn mở .NET (NMock2, NHibernate, Ninject,… đều sử dụng nó). Thông báo quan trọng duy nhất là bạn sẽ không thể sử dụng proxy cho các lớp được niêm phong. –

+0

Cảm ơn! Điều này thực sự trông giống như các giải pháp tôi đang tìm kiếm (mặc dù tôi sẽ phải đào sâu hơn vào nó). – Haggai

4

Sử dụng Decorator pattern hoặc viết extension methods.

+1

Cảm ơn. Các mẫu trang trí không phù hợp, tôi nghĩ, vì chúng yêu cầu tôi thay đổi toàn bộ chương trình của tôi để sử dụng chúng, và tôi muốn trình bao bọc phải minh bạch cho người dùng T. Về phương pháp mở rộng - bạn có thể sử dụng một phương pháp tương tự để thêm biến cho lớp (tức là đối với từng đối tượng)? Hoặc chỉ có phương pháp? – Haggai

2

Có lẽ một cái gì đó như thế này:

public class Wrapper<T> 
{ 
    public readonly T Object; 

    public Wrapper(T t) 
    { 
     Object = t; 
    } 
} 

Và sau đó bạn có thể sử dụng nó như sau:

Wrapper<Square> mySquare = new Wrapper<Square>(new Square(2.5)); 
Console.Write("Edge {0} -> Area {1}", mySquare.Object.EdgeLength, mySquare.Object.Area); 
+0

Cảm ơn, nhưng đó là những gì tôi đang cố gắng tránh. Tôi muốn các wrapper được minh bạch cho người sử dụng của T. – Haggai

+0

Câu trả lời này giúp tôi rất nhiều: D – Krishan

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