2008-09-29 31 views
5

Nói cách khác, nó là đúng để sử dụng:Có đúng không khi sử dụng thừa kế thay vì đặt bí danh tên trong C#?

public class CustomerList : System.Collections.Generic.List<Customer> 
{ 
    /// supposed to be empty 
} 

thay vì:

using CustomerList = System.Collections.Generic.List<Customer> 

Tôi muốn sử dụng phương pháp tiếp cận đầu tiên bởi vì tôi chỉ muốn xác định CustomerList một lần, và mỗi lần tôi cần danh sách khách hàng tôi luôn sử dụng cùng một loại. Mặt khác, sử dụng cách tiếp cận bí danh tên không chỉ buộc tôi phải định nghĩa lại nó ở khắp mọi nơi, mà còn có một bí danh khác nhau có thể được đưa ra mỗi khi ai đó muốn sử dụng nó (nghĩ về một nhóm lớn), và do đó gây ra mã ít đọc được hơn.

Xin lưu ý rằng ý định trong trường hợp này sẽ không bao giờ mở rộng lớp học, chỉ để tạo bí danh.

Trả lời

6

Đừng làm điều đó. Khi mọi người đọc:

List<Customer> 

họ ngay lập tức hiểu điều đó. Khi họ đọc:

CustomerList 

họ phải tìm hiểu xem Danh sách khách hàng là gì và làm cho mã của bạn khó đọc hơn. Trừ khi bạn là người duy nhất làm việc trên codebase của bạn, viết mã có thể đọc được là một ý tưởng hay.

+1

Đây là một đối số thẩm mỹ. Một số có thể tìm thấy một cách hoặc cách dễ dàng hơn để đọc. Trong trường hợp này nó có thể là tầm thường, nhưng trong những trường hợp phức tạp hơn, nó bắt đầu quan trọng hơn. – Catskul

11

tốt, trừ khi bạn thêm một số chức năng vào lớp cơ sở không có điểm trong việc tạo đối tượng bao bọc. Tôi sẽ đi với số hai nếu bạn thực sự cần, nhưng tại sao không chỉ tạo ra một biến?

List<Customer> customerList = new List<Customer>(); 
+0

Tôi đồng ý với 'chỉ sử dụng biến' nhưng không nghĩ bạn nên chủ trương sử dụng bí danh theo cách @Trap muốn sử dụng nó. –

+0

Đó là sự thật, tôi sẽ không làm điều đó, nhưng tôi đã không chắc chắn chính xác lý do tại sao anh ta sẽ cần phải làm một trong hai nơi đầu tiên, và đó là câu hỏi. –

1

Đây là một trong những câu hỏi 'Phụ thuộc'.

Nếu những gì bạn cần là một lớp mới hoạt động như Danh sách khách hàng ngoài các yêu cầu khác của bạn thì kế thừa là cách.

Nếu bạn chỉ muốn sử dụng danh sách khách hàng thì hãy sử dụng biến.

1

Nếu bạn chỉ đang cố gắng lưu khi nhập, hãy sử dụng sau. Bạn sẽ không gặp phải bất kỳ vấn đề thừa kế kỳ lạ nào theo cách đó.

Nếu bạn thực sự muốn trưng bày một loại bộ sưu tập khác biệt về mặt logic, sau đó sử dụng loại cũ - bạn có thể quay lại và thêm nội dung vào đó.

Cá nhân, tôi chỉ sử dụng List<Customer> và gọi nó là một ngày.

1

Tôi về cơ bản đồng ý với Ed. Nếu bạn không cần thực sự mở rộng chức năng của cấu trúc Danh sách chung, chỉ cần sử dụng Danh sách chung chung:

List<Customer> customerList = new List<Customer>(); 

Nếu bạn cần mở rộng chức năng thì thông thường bạn sẽ xem xét kế thừa.

Khả năng thứ ba là nơi bạn cần chức năng thay đổi đáng kể từ cấu trúc danh sách chung, trong trường hợp đó bạn có thể chỉ muốn kế thừa từ IEnumerable. Làm như vậy làm cho lớp có thể sử dụng được trong các hoạt động có thể đếm được (chẳng hạn như "foreach") nhưng cho phép bạn xác định hoàn toàn tất cả các hành vi của lớp.

1

Tiết kiệm của một lập trình viên khi gõ có thể là cơn ác mộng bảo trì của người lập trình tiếp theo. Tôi muốn nói rằng chỉ cần gõ chính xác chung, như rất nhiều ở đây đã nói. Nó sạch hơn và mô tả chính xác hơn về ý định mã của bạn và nó sẽ giúp lập trình viên bảo trì. (Ai có thể là bạn, sáu tháng và bốn dự án mới trên đường!)

3

Thực ra bạn cũng không nên sử dụng. Các correct approach according to the framework design guidelines is to either use or inherit from System.Collections.ObjectModel.Collection<T> trong các API công cộng (Danh sách <T> chỉ nên được sử dụng để triển khai nội bộ).

Nhưng liên quan đến các vấn đề cụ thể của việc đặt tên, đề nghị xuất hiện để được sử dụng các loại tên generic trực tiếp mà không răng cưa, trừ khi bạn cần phải thêm chức năng cho bộ sưu tập:

Đừng trở Collection <T> từ đối tượng mô hình để cung cấp API thu thập vani tiêu chuẩn .

Thực hiện trả lại một phân lớp của Bộ sưu tập <T> từ các mô hình đối tượng để cung cấp API thu thập cấp cao.

4

Tôi đồng ý với không sử dụng bí danh theo cách đó. Không ai trong nhóm của bạn nên sử dụng bí danh theo cách được trình bày; đó không phải là lý do răng cưa được cung cấp. Ngoài ra, từ cách generics làm việc, chỉ có một lớp List bất kể bạn sử dụng nó bao nhiêu.

Ngoài việc khai báo và sử dụng List<Customer>, bạn sẽ muốn chuyển danh sách đó sang danh sách khác. Tránh vượt qua bê tông List<Customer> và thay vào đó, hãy chuyển một số IList<Customer> hoặc ICollection<Customer> vì điều này sẽ làm cho các phương pháp đó trở nên linh hoạt và dễ dàng hơn để chống lại chương trình.

Một ngày trong tương lai, nếu bạn thực sự cần lớp sưu tập Danh sách khách hàng, bạn có thể triển khai ICollection<Customer> hoặc IList<Customer> trên đó và tiếp tục chuyển cho những phương pháp đó mà không thay đổi hoặc thậm chí biết rõ hơn.

3

Sử dụng thừa kế để làm bí danh/đánh máy có vấn đề yêu cầu bạn xác định lại các nhà thầu có liên quan.

Vì nó sẽ nhanh chóng trở thành vô lý để làm điều đó ở khắp mọi nơi, tốt nhất nên tránh nó vì mục đích nhất quán.

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