泛型约束
以前知道where T:class 和where T:struct的作用是约束T是自定义类类型还是值类型;
还有就是where T:new()的作用是约束必须有一个无参的构造函数。
但是对于where T:IFoo和where T:Foo,就只知道有这么一个约束,自己也没深入研究过,而且自己写的泛型类也比较少吧。
现在知道,约束为某一个接口和摸一个基类的作用就是为了指定,并且能够在代码里直接用T使用接口和基类的属性和方法;
如下所示:
class Program { static void Main(string[] args) { DocumentManager<Document> doc = new DocumentManager<Document>(); doc.AddDocument(new Document("天气","晴朗")); doc.AddDocument(new Document("动漫", "秦时明月")); Console.WriteLine(doc.IsDocumentAvailable); doc.DisplayAllDocument(); Console.Read(); } } // 创建一个DocumentManager<T>类 // 并且添加一个AddDocument方法,将文档添加到队列里 // 如果队列是不空,IsDocumentAvailable只读属性就返回true public class DocumentManager<T> where T : IDocument { private readonly Queue<T> documentQueue = new Queue<T>(); public void AddDocument(T doc) { lock(this) { documentQueue.Enqueue(doc); } } public bool IsDocumentAvailable { get { return documentQueue.Count > 0; } } public void DisplayAllDocument() { foreach (T doc in documentQueue) { // 可以直接使用IDocument的属性 Console.WriteLine(doc.Title + ":" + doc.Content); } } } // 如果泛型类需要调用泛型类型中的方法,就必须添加约束。 // 对于DocumentManager<T>,文档所有标题应在DisplayAllDocument()方法中显示。 // Document类实现带有Title和Content属性的IDocument接口: public interface IDocument { string Title { get; set; } string Content { get; set; } } public class Document : IDocument { public string Title { get; set; } public string Content { get; set; } public Document() { } public Document(string title, string content) { this.Title = title; this.Content = content; } }

浙公网安备 33010602011771号