2011-12-11 33 views
10

Có một giả định khá an toàn rằng lớp sau là đại diện lẻ của "hạ cấp" (vì thiếu từ tốt hơn) trường lớp riêng tư?Bộ sưu tập và danh sách

public class AggregatedClass : ICollection<SingleClass> 
{ 
    List<SingleClass> _singleClassList; 

    // ...rest of code 
} 

Gần đây tôi đã nhìn thấy ví dụ "đang hoạt động" về điều này và nó đã ném tôi một chút vòng lặp. Điểm trên là gì? Nếu List<T> thực hiện ICollection<T>, thì không phải lớp trên là sự đảo ngược? Bạn đang có một trường lớp riêng là lớp loại là một phần mở rộng của việc thực hiện lớp của cha mẹ nó (ICollection<T>).

Có chính xác khi nói ví dụ trên không thực sự là một thiết kế tuyệt vời?

+0

Vâng, bạn vẫn cần cấu trúc dữ liệu để giữ dữ liệu, đúng không? Có thể là danh sách hoặc mảng, ICollection hoặc bất kỳ thứ gì. Danh sách xảy ra để làm cho nó khá dễ dàng để thực hiện ICollection . – hawkke

+0

@hawkke "Danh sách xảy ra để làm cho nó khá dễ dàng để thực hiện IColleciton ."Bạn có nói rằng chỉ vì' List 'thực sự thực hiện ICollection ? –

+0

Nó có dư thừa không? Chắc chắn, một chút. Bạn có thể làm cho một đối số rằng _singleClassList có thể là một thuộc tính công khai. – hawkke

Trả lời

3

Điều này tóm tắt chi tiết triển khai List<T> và nếu cần thiết, lớp hiện có thể cung cấp logic bổ sung trong các phương pháp khác nhau của danh sách (Thêm/Xóa v.v.).).

Nếu bạn có nghĩa là trường phải là ICollection - tốt, đó là tùy thuộc vào lớp học! Nó có thể đang sử dụng các phương thức List-of-T bổ sung, hoặc nó có thể là một chi tiết triển khai không liên quan, thuận tiện cho bất cứ ai đã viết lớp và không gây hại vì nó là riêng tư.

+0

Vì vậy, những gì bạn đang nói về cơ bản là lớp thực hiện 'ICollection ' có thể cần phải sử dụng 'List ' thành viên, nhưng công khai một thể hiện của 'AggregatedClass' sẽ không thể sử dụng' Danh sách 'thành viên? –

+0

@Shark người gọi không nên quan tâm ** những gì ** nó sử dụng nội bộ miễn là nó đáp ứng các hợp đồng được quảng cáo ... –

+0

Phải, vì vậy về cơ bản đây là một hình thức bảo mật (hoặc ... moreso một hạn chế) không hiển thị các thành viên 'Danh sách 'và chỉ hiển thị 'ICollection ' thành viên (ít nhất)? –

3

Nó gần như phụ thuộc vào những gì AggregatedClass những gì sẽ làm trong tương lai gần: bằng cách thực hiện ICollection sử dụng một lĩnh vực tư nhân rời khỏi nhà thiết kế tự do đưa ra AggregatedClass xuất phát từ một số khác.

Vì C# không cho phép đa thừa kế, nó là một điều quý giá.

Theo ý kiến ​​của tôi, nếu lớp học "chủ yếu" là Danh sách Tôi sẽ lấy trực tiếp nó. Trong trường hợp tôi cần kế thừa từ một lớp khác, bạn luôn có thể lớp refactor theo cách bạn đã hiển thị trong câu hỏi của mình.

6

Tôi sẽ nói không có gì sai với điều đó. Các AggregatedClass cung cấp một hợp đồng là ICollection<SingleClass> và làm thế nào mà hợp đồng được thực hiện là một chi tiết thực hiện, không có ý định chơi chữ.

Nếu ví dụ như các lớp được định nghĩa như sau:

public class AggregatedClass : List<SingleClass> 

sau đó tôi sẽ phải nói rằng có, có một vấn đề thiết kế với điều đó. Đó là khuyến cáo để không lộ List<T> trong API công cộng và thay vào đó phơi bày Collection<T> từ bộ sưu tập cung cấp phương pháp ảo như InsertItemClearItems và danh sách đối tác không cung cấp bất kỳ phương pháp ảo mà sau này có thể được sử dụng để thay đổi hành vi trong một lớp cơ sở.

Nếu bạn không muốn kế thừa cụ thể từ Collection<T> thì thực hiện ICollection<T> như trong ví dụ bạn đã cung cấp là một giải pháp thay thế phù hợp khác, điều này cũng cho phép lớp kế thừa từ lớp cơ sở khác.

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