Generic parameter interface : Generic Interface « Generics « C# / C Sharp






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);
        }

    }
}

 








Related examples in the same category

1.Demonstrate a generic interfaceDemonstrate a generic interface
2.Generic Interface Demo