2011-02-18 23 views
8

Mục đích của() mới trong khi khai báo lớp BaseEntityCollection là gì?
Nếu tôi sẽ loại bỏ nó, tôi đã nhận ra lỗi với thông báo sau "T phải là một loại phi trừu tượng với một constructor parameterless nào để sử dụng nó như là tham số ..."Mục đích của() mới trong khi khai báo một lớp chung là gì?

public abstract partial class BaseEntityCollection<T> : 
     List<T> where T : BaseEntity, new() 

Trả lời

18

Điều đó có nghĩa là bất kỳ lớp nào bạn chỉ định cho T, nó có một hàm tạo mặc định (không có tham số).

Do đó, trong lớp chung chung, bạn có thể làm new T() và nó sẽ tạo ra một đối tượng mới của loại T.

1

Loại T phải có một constructor parameterless. Điều này cho phép bạn tạo các phiên bản mới bằng cách thực hiện var t = new T(), điều này sẽ là không thể nếu không.

4

Viết new() buộc tham số có hàm tạo mặc định.

Nếu không có, bạn không thể viết new T().
Lỗi của bạn xảy ra khi bạn cố chuyển loại không phải là new() dưới dạng tham số new() 'd.


Ngoài ra, do not inherit List<T>.
Thay vào đó, bạn nên kế thừa Collection<T>, được thiết kế để kế thừa.

+0

Nếu tôi định sử dụng Collectiion , làm cách nào để tạo đối tượng bộ sưu tập mới kế thừa từ Bộ sưu tập ? – Ahmed

+1

@Ahmed: Chỉ cần kế thừa nó. – SLaks

1

Đây là ký hiệu cho ràng buộc chung chung: Phải có công khai (tham số) hàm tạo tham số.

0

Đó là một trong những "hạn chế loại chung" có thể bạn có thể liên kết với loại chung của mình. Sử dụng ràng buộc "new()" sẽ chỉ cho phép bạn sử dụng một kiểu generic nếu nó có một hàm tạo parameterless. Điều này có thể hữu ích cho những thứ như serialization, hoặc nhà máy loại phương pháp, nơi bạn cần phải tạo ra một đối tượng kiểu T.

Dưới đây là một số những hạn chế loại generic khác: http://msdn.microsoft.com/en-us/library/d5x73970(v=vs.80).aspx

1

này có nghĩa là loại generic của bạn có để có constructor parameterless.

BaseEntityCollection<T> : List<T> 

Tôi không chắc bạn đang làm gì ở đây, nhưng tôi nghĩ điều đó trái với quy tắc của Liskov. Kiểm tra hệ thống phân cấp của bạn.

Constraints on Type Parameters

+0

Quy tắc của Liskov là gì? – Ahmed

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