2016年11月2日 星期三

Interface, abstract class

今天試著寫grabber跟processor
本來是寫用Mil作grabber, vidi作processor
後來想想說把他抽象化,趁機研究了一下abstract, Interface跟呼叫base的contructor
processor的介面大致如下
他可以設定/提取處理影像的格式(這裡我是假設影像規格是一致的)
在處理完成後會觸發bufferWritable事件,以通知這個buffer可以被覆蓋
可以被通知等待處理的暫存器已經準備完成
    interface IImageProcessor
    {
        ImageInformation imageInformation { get; set; }
        event BufferOkHandler bufferWritable;
        void SetImage(byte[] image);
    }

provider的介面如下
可以知道提取影像的格式
輸出影像後會觸發outBufferReady事件
可以被通知儲存輸出影像的暫存器已經準備好了
    public interface IImageProvider
    {
        ImageInformation imageInformation { get; }
        event BufferOkHandler outBufferReady;
        void SetOutBuffer(byte[] buffer);
    }

provider跟processor之間有一定的關聯性
例如:
provider的影像格式跟processor一樣
provider觸發的outBufferReady事件會由processor的SetImage處理
processor觸發的bufferWritable事件會由provider的SetOutBuffer處理 
因此可以建立一個抽象類別,這個類別描述如何使用一個provider來建立一個processor(建立processor不必實際知道provider全部的實作細節,只需要知道provider介面底下的東西)

這個抽象類別大概如下
public abstract class ImageProcessorAbstract:IImageProcessor
    {
        public abstract ImageInformation imageInformation { get; set; }
        public abstract event BufferOkHandler bufferWritable;
        public abstract void SetImage(byte[] image);
        public ImageProcessorAbstract(IImageProvider provider)
        {
            SetProvider(provider);
        }
        public void SetProvider(IImageProvider provider)
        {
            if (provider != null)
            {
                provider.outBufferReady += SetImage;
                bufferWritable += provider.SetOutBuffer;
                imageInformation = provider.imageInformation;
            }
        }
    }
因為要實作IImageProcessor介面,所有interface中的member都需要實作,但如果依然還沒有要實作,可以用abstract屬性
可以看到我們abstract class中主要是產生用provider建構的建構式。

最後在實作class的時候只需要繼承abstract class就同時表示時作了介面public class VidiController:ImageProcessorAbstract
在實作class建構式中需要去呼叫base的建構式,例如:
        public VidiController(string remoteAddress,IImageProvider provider = null) : base(provider)
        {
            vidiControl = new ViDi2.Runtime.Remote.Control(remoteAddress, ViDi2.FormsImage.Factory);
        }
其中: base(provider)就是在呼叫AbstractClass的建構式。這裡provider可以不指定,預設值為null

沒有留言:

張貼留言