C#實現介面回撥
阿新 • • 發佈:2019-01-27
通常情況下,我們建立一個物件,並馬上直接去使用它的方法。然而,在有些情況下,希望能在某個場景出現後或條件滿足時才呼叫此物件的方法。回撥就可以解決這個“延遲呼叫物件方法”的問題。這個被呼叫方法的物件稱為回撥物件。
實現回撥的原理簡介如下:
首先建立一個回撥物件,然後再建立一個控制器物件,將回調物件需要被呼叫的方法告訴控制器物件.控制器物件負責檢查某個場景是否出現或某個條件是否滿足.當此場景出現或此條件滿足時,自動呼叫回撥物件的方法.
以下為C#實現回撥的一個小例子。
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//建立一個控制器物件,將提供給它的回撥物件傳入
Controller obj = new Controller(new CallBack());
//啟動
obj.Star();
}
}
public interface IBack
{
void run();
}
public class CallBack : IBack
{
public void run()
{
//為了簡潔這裡只是顯示下時間
System.Console.WriteLine(DateTime.Now);
}
}
public class Controller
{
public IBack CallBackObj = null ; //這裡引用回撥物件
public Controller(IBack obj)
{
this.CallBackObj = obj;
}
public void Star()
{
Console.WriteLine("敲鍵盤任意鍵就顯示當前的時間,直到按ESC退出....");
while (Console.ReadKey(true).Key != ConsoleKey.Escape)
{
CallBackObj.run();
}
}
}
}
可以看到,當示例程式執行時,何時呼叫CallBack物件的run()方法是由使用者決定的,使用者每敲一個鍵,控制器物件就呼叫一次CallBack的run()方法。這個示例中實現回凋的關鍵在於IBack介面的引入。
如果不用IBack介面,而直接使用 CallBack物件,一樣可以實現同樣的效果,如下:
public class Controller
{
public CallBack CallBackObj = null; //回撥物件方法的引用
public Controller(CallBack obj)
{
this.CallBackObj = obj;
}
public void Star()
{
Console.WriteLine("敲鍵盤任意鍵就顯示當前的時間,直到按ESC退出....");
while (Console.ReadKey(true).Key != ConsoleKey.Escape)
{
CallBackObj.run();
}
}
}
但仔細思考,這樣做的結果就使Controller類與CallBack物件繫結在一起,萬一如果需要呼叫其他型別的物件,則必須修改Controller類的程式碼。
如果Controller類接收的是一個抽象的介面變數IBack,則任何實現了該介面的物件都可以被Controller類物件所回撥,Controller類的程式碼就再不用被修改,保證了程式碼對環境的適應性,無疑是一個很好的解決方案。