泛型约束

以前知道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;
        }
    }

 

posted @ 2015-04-14 16:29  江境纣州  阅读(99)  评论(0)    收藏  举报