2010-09-08 32 views
5

Tôi đang làm việc trên một công cụ có thể được cấu hình bởi người dùng (không phải người dùng cuối, người dùng thư viện) để sử dụng các thành phần khác nhau. Ví dụ: Ví dụ: giả sử lớp Drawer phải có ITool, Pencil hoặc BrushIPattern, Plain hoặc Mosaic. Ngoài ra, chúng ta hãy nói một Brush phải có một IMaterial của một trong hai Copper hoặc WoodSử dụng Generics trong Class

Hãy nói rằng ảnh hưởng của việc lựa chọn Pencil hoặc Brush thực sự quyết liệt khác nhau, và cùng đi cho các loại IPattern. nó sẽ là một ý tưởng tồi để mã lớp Drawer với các khái niệm chung như thế này:

public class Drawer<Tool, Pattern> where Tool: ITool where Pattern : IPattern { ... } 
public class Brush<Material> where Material : IMaterial { ... } 

Một sau đó có thể sử dụng lớp như:

Drawer<Pencil, Mosaic> FirstDrawer = new Drawer<Pencil, Mosaic>(); 
Drawer<Brush<Copper>, Mosaic> SecondDrawer = new Drawer<Brush<Copper>, Mosaic>(); 

Tôi chủ yếu sử dụng chung cho các bộ sưu tập và như vậy và nơi trú ẩn' t thực sự thấy generics được sử dụng cho rằng loại điều. Tôi có nên không?

Trả lời

3

Nó không thực sự có ý nghĩa khi sử dụng Generics trừ khi công cụ bạn đang tạo có phương pháp với đối số hoặc trả về loại chung loại. I E. bạn mong chờ có được một propertie và các phương pháp như

public <Material> Material { get; } 
public void Draw(<Tool> pen); 

(Tôi hiện đang trong một chế độ Java vì vậy hãy sửa C# cú pháp nếu sai!)

Từ những gì tôi có thể nói từ ví dụ bạn chỉ sử dụng Generics cho constructor của các lớp. Vì bạn đang dựa vào các giao diện trong việc thực hiện của bạn, việc sử dụng generics không thực sự thêm giá trị.

Có lẽ tôi đã nhầm lẫn nhưng generics thực sự là an toàn cho loại được kiểm tra tại thời gian biên dịch và để tránh rất nhiều (mạo hiểm) loại đúc.

+0

Cảm ơn, phần về "trừ khi động cơ bạn đang tạo có phương pháp với đối số hoặc trả về các loại loại generic "thực sự đã giúp tôi nhận ra rằng nó sẽ vô ích đến mức nào khi sử dụng Generics trong trường hợp đó! Chắc chắn nó sẽ làm việc bằng cách sử dụng Generics, nhưng nó sẽ được sử dụng Generics chỉ để sử dụng Generics :-P – Tipx

2

Nó có thể hoạt động, nhưng nó phụ thuộc việc có khác biệt gì khi chuyển một số ITool/IPattern vào thông qua hàm tạo. Trong một phần phụ thuộc vào sự tiện lợi, và một phần là liệu bạn có làm bất cứ điều gì thú vị với các tham số mẫu (ví dụ, new chúng).

Thành thật mà nói, ví dụ đưa ra không không bước nhảy vọt với tâm trí như một sự phù hợp tốt cho Generics - bạn có thể không thuận tiện có một bộ bàn chải, ví dụ (trừ khi bạn có thêm một số trừu tượng - có lẽ IBrush - không được hiển thị).

Winforms chuẩn (system.drawing.dll) thực hiện điều này thông qua các thuộc tính tĩnh, như Pens.Red, Brushes.Blue (đối với bàn chải cứng cơ bản) - có thể lấy cảm hứng từ đó? hoặc có thể không. Tùy thuộc vào bạn.

+0

Trong thực tế, nó không phải là một "ngăn kéo" ở tất cả tôi đang làm, đó là một động cơ 2D Collision đơn giản :-) – Tipx

2

Trong trường hợp này, tôi sẽ ưu tiên thành phần trên generics. Tôi tưởng tượng trong khi công cụ sẽ là trách nhiệm của ngăn kéo, mẫu sẽ là trách nhiệm của công cụ.

public class Drawer 
{ 
    private ITool _tool; 

    public Drawer(ITool tool, IPattern pattern) 
    { 
     _tool = new Tool(pattern); 
    } 
    ... 
} 

public class Tool : ITool 
{ 
    private IPattern _pattern; 

    public Tool(IPattern pattern) 
    { 
     _pattern = pattern; 
    } 
    ... 
} 
Các vấn đề liên quan