Generic parameter interface
using System; using System.Collections.Generic; using System.Text; using System.Threading; public interface IPresentation { string Title { get; } string Content { get; } } public class Presentation : IPresentation { private string title; public string Title { get { return title; } } private string content; public string Content { get { return content; } } public Presentation(string title, string content) { this.title = title; this.content = content; } } public class ProcessPresentations<TPresentation, TPresentationManager> where TPresentation : IPresentation where TPresentationManager : IPresentationManager<TPresentation> { public static void Start(TPresentationManager dm) { new Thread(new ProcessPresentations<TPresentation, TPresentationManager>(dm).Run).Start(); } protected ProcessPresentations(TPresentationManager dm) { documentManager = dm; } private TPresentationManager documentManager; protected void Run() { while (true) { if (documentManager.IsPresentationAvailable) { TPresentation doc = documentManager.GetPresentation(); Console.WriteLine("Processing document {0}", doc.Title); } Thread.Sleep(20); } } } public interface IPresentationManager<T> { void AddPresentation(T doc); T GetPresentation(); bool IsPresentationAvailable { get; } } public class PresentationManager<T> : IPresentationManager<T> { private Queue<T> documentQueue = new Queue<T>(); public void AddPresentation(T doc) { lock (this) { documentQueue.Enqueue(doc); } } public T GetPresentation() { T doc; lock (this) { doc = documentQueue.Dequeue(); } return doc; } public bool IsPresentationAvailable { get { return (documentQueue.Count > 0) ? true : false; } } } class Program { static void Main(string[] args) { PresentationManager<Presentation> dm = new PresentationManager<Presentation>(); ProcessPresentations<Presentation, PresentationManager<Presentation>>.Start(dm); for (int i = 0; i < 1000; i++) { Presentation d1 = new Presentation("title" + i.ToString(), "content"); dm.AddPresentation(d1); Console.WriteLine("added document {0}", d1.Title); Thread.Sleep(10); } } }
1. | Demonstrate a generic interface | ||
2. | Generic Interface Demo |