委拖是.NET 引入的一種重要技朮﹐可以實現對象的動態綁定。是面向對象和類型安全。主要用于.NET Framework的事件處理和回調函數。
委拖是一種組合方法﹐簡單的理解:兩個對象參與處理一個請求。接受請求的對象將操作委拖給代理者﹐并將自身傳給代理者﹐讓代理者可以引用接受請求的對象。從某種程度上來說﹐她相當于C++的函數指針﹐或者說接口﹐但比接口好一點的是她可以是靜態的。
使用委拖﹐一般的步驟是﹕聲明委托﹐實例委托﹐調用委托﹗
一個類中的任何方法﹐只要其簽名符合聲明的委托的簽名﹐那么該方法都可以賦給該委托的。
根據GoF設計模式﹐委托結構如下圖﹕(申明﹕該圖并非UML)
據該圖﹐代碼就可以很容易的寫成。而且Window類根本不需要實現Area()方法。他可以代理Rectangle的Area()方法。如下﹕
using System;
namespace DelegateTest
{
/// <summary>
/// Class1 的摘要描述。
/// </summary>
class Class1
{
/// <summary>
/// 應用程式的主進入點。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此加入啟動應用程式的程式碼
//
Window w = new Window ();
Rectangle r = new Rectangle ();
w.myDelArea = new DelArea(r.Area);
w.myDelArea();
}
}
public delegate float DelArea();
public class Window
{
public DelArea myDelArea;
}
public class Rectangle
{
private float Width = 8;
private float Height = 9;
public float Area()
{
float returnVaue = Width * Height;
Console.WriteLine("Width * Height = {0}",returnVaue );
return returnVaue;
}
}
}
當然﹐在這里﹐可能不用委托更好理解﹐我將其用在這里﹐是想起一個拋磚引玉的作用。歡迎讀者朋友們丟玉﹗呵呵……namespace DelegateTest
{
/// <summary>
/// Class1 的摘要描述。
/// </summary>
class Class1
{
/// <summary>
/// 應用程式的主進入點。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此加入啟動應用程式的程式碼
//
Window w = new Window ();
Rectangle r = new Rectangle ();
w.myDelArea = new DelArea(r.Area);
w.myDelArea();
}
}
public delegate float DelArea();
public class Window
{
public DelArea myDelArea;
}
public class Rectangle
{
private float Width = 8;
private float Height = 9;
public float Area()
{
float returnVaue = Width * Height;
Console.WriteLine("Width * Height = {0}",returnVaue );
return returnVaue;
}
}
}