-
//源代码下载路径:http://media.wiley.com/product_ancillary/41/07645753/DOWNLOAD/Ch10.zip
-
namespace Wrox.ProCSharp.Generics
-
{
-
using System;
-
using System.Threading;
-
using System.Collections.Generic;
-
-
public interface IDocument
-
{
-
string Title { get;}
-
string Content { get;}
-
}
-
-
public class Document : IDocument
-
{
-
private string title;
-
public string Title
-
{
-
get { return title; }
-
}
-
-
private string content;
-
public string Content
-
{
-
get { return content; }
-
}
-
-
public Document(string title, string content)
-
{
-
this.title = title;
-
this.content = content;
-
}
-
}
-
-
/// <summary>
-
/// 定制泛型类【使用接口约束】
-
/// </summary>
-
public class ProcessDocuments<TDocument, TDocumentManager>
-
where TDocument : IDocument
-
where TDocumentManager : IDocumentManager<TDocument>
-
{
-
public static void Start(TDocumentManager dm)
-
{
-
new Thread(new ProcessDocuments<TDocument, TDocumentManager>(dm).Run).Start();
-
}
-
-
protected ProcessDocuments(TDocumentManager dm)
-
{
-
//注意不能把null赋予泛型类型,因为泛型类型也可以是值类型。
-
//其中T doc = default(T);//则会将null赋予引用类型,把0赋予值类型。
-
documentManager = dm;
-
}
-
-
//使用泛型类型定义成员字段
-
private TDocumentManager documentManager;
-
-
protected void Run()
-
{
-
while (true)
-
{
-
if (documentManager.IsDocumentAvailable)
-
{
-
TDocument doc = documentManager.GetDocument();
-
Console.WriteLine("Processing document {0}", doc.Title);
-
}
-
Thread.Sleep(20);
-
}
-
}
-
}
-
-
/// <summary>
-
/// 定制泛型接口
-
/// </summary>
-
public interface IDocumentManager<T>
-
{
-
void AddDocument(T doc);
-
T GetDocument();
-
bool IsDocumentAvailable
-
{
-
get;
-
}
-
}
-
-
/// <summary>
-
/// 定制泛型类
-
/// </summary>
-
public class DocumentManager<T> : IDocumentManager<T>
-
{
-
private Queue<T> documentQueue = new Queue<T>();
-
-
//泛型类型作为参数类型
-
public void AddDocument(T doc)
-
{
-
lock (this)
-
{
-
documentQueue.Enqueue(doc);
-
}
-
}
-
-
//泛型类型作为返回类型
-
public T GetDocument()
-
{
-
T doc;
-
lock (this)
-
{
-
doc = documentQueue.Dequeue();
-
}
-
return doc;
-
}
-
-
public bool IsDocumentAvailable
-
{
-
get { return (documentQueue.Count > 0) ? true : false; }
-
}
-
}
-
-
class Program
-
{
-
static void Main(string[] args)
-
{
-
DocumentManager<Document> dm = new DocumentManager<Document>();
-
-
ProcessDocuments<Document, DocumentManager<Document>>.Start(dm);
-
-
for (int i = 0; i < 1000; i++)
-
{
-
Document doc = new Document("title" + i.ToString(), "content");
-
dm.AddDocument(doc);
-
Console.WriteLine("added document {0}", doc.Title);
-
Thread.Sleep(10);
-
}
-
}
-
}
-
}