2008-10-23 22 views
34

Có thể cho loại giao diện chung được dựa trên một lớp cha cụ thể không?C# generics có thể có một loại cơ sở cụ thể?

Ví dụ:

public interface IGenericFace<T : BaseClass> 
{ 
} 

Rõ ràng là mã trên không làm việc nhưng nếu nó đã làm, những gì tôi đang cố gắng để nói với trình biên dịch là T phải là một sub-class của BaseClass. Có thể được thực hiện, có kế hoạch cho nó, vv?

Tôi nghĩ rằng nó sẽ hữu ích về một dự án cụ thể, đảm bảo giao diện/lớp chung không được sử dụng với (các) kiểu ngoài ý muốn tại thời gian biên dịch. Hoặc cũng để sắp xếp tự tài liệu: hiển thị loại loại dự định.

Trả lời

81
public interface IGenericFace<T> where T : SomeBaseClass 
+2

Bạn có thể tìm thêm thông tin về làm thế nào để hạn chế các loại tại http://msdn.microsoft.com/en-us/library/d5x73970(VS.80).aspx – tvanfosson

+0

@Kyralessa, là có thể có một baseclass chung – Demodave

5

có.

public interface IGenericFace<T> 
    where T : BaseClass 
{ 
} 
+4

này nên được xóa, tôi không thấy làm thế nào nó được thêm bất cứ điều gì - Kyralessa đã trả lời này. –

59

gì bạn đang đề cập đến được gọi là "ràng buộc Generic". Có nhiều ràng buộc có thể được đặt trên một kiểu chung.

Một số ví dụ cơ bản như sau:

  • where T: struct - Đối số loại phải đạt được một loại giá trị. Bất kỳ loại giá trị nào trừ Nullable - đều có thể được chỉ định. Xem Using Nullable Types (C# Programming Guide) để biết thêm thông tin.

  • where T : class - Đối số loại phải là loại tham chiếu; điều này cũng áp dụng cho mọi loại, giao diện, đại biểu hoặc loại mảng.

  • where T : new() - Đối số kiểu phải có hàm tạo công khai không tham số. Khi được sử dụng cùng với các ràng buộc khác, ràng buộc new() phải được chỉ định cuối cùng.

  • where T : <base class name> - Đối số kiểu phải là hoặc lấy được từ lớp cơ sở được chỉ định.

  • where T : <interface name> - Đối số loại phải là hoặc triển khai giao diện được chỉ định. Có thể chỉ định nhiều ràng buộc giao diện. Giao diện ràng buộc cũng có thể là chung chung.

  • where T : U - Đối số loại được cung cấp cho T phải hoặc lấy được từ đối số được cung cấp cho U. Điều này được gọi là một ràng buộc kiểu naked.

Đây cũng có thể được liên kết với nhau như thế này:

C#

public class TestClass<T> where T : MyBaseClass, INotifyPropertyChanged, new() { } 
public interface IGenericFace<T> where T : SomeBaseClass 

VB

Public Class TestClass(Of T As {MyBaseClass, INotifyPropertyChanged, New}) 
Public Interface IGenericInterface(Of T As SomeBaseClass) 
Các vấn đề liên quan