1. 程式人生 > >C#實現介面回撥

C#實現介面回撥

通常情況下,我們建立一個物件,並馬上直接去使用它的方法。然而,在有些情況下,希望能在某個場景出現後或條件滿足時才呼叫此物件的方法。回撥就可以解決這個“延遲呼叫物件方法”的問題。這個被呼叫方法的物件稱為回撥物件。
實現回撥的原理簡介如下:
首先建立一個回撥物件,然後再建立一個控制器物件,將回調物件需要被呼叫的方法告訴控制器物件.控制器物件負責檢查某個場景是否出現或某個條件是否滿足.當此場景出現或此條件滿足時,自動呼叫回撥物件的方法.
以下為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類的程式碼就再不用被修改,保證了程式碼對環境的適應性,無疑是一個很好的解決方案。