我們在下面結果運行後在進行解析:
class MinisterA
{
public static goldCoin MinisterAOneYearDo()
{
goldCoin coins = new goldCoin(100);
Console.WriteLine("我是大臣A,我給國王帶來了100顆金幣.");
return coins;
}
}
class MinisterB
{
public static goods MinisterBOneYearDo()
{
goods GOODS = new goods();
Console.WriteLine("我是大臣B,我給國王帶來了本國沒有的精美貨物.");
return GOODS;
}
}
class MinisterC
{
public static goldCoin MinisterCOneYearDo()
{
goldCoin coins = new goldCoin(10);
Console.WriteLine("我是大臣C,我給國王帶來了還是原來的那10顆金幣.");
return coins;
}
}
class Program
{
static void Main(string[] args)
{
//讓我們了解下國王的命令,其實就是我們委托的簽名
//delegate MinisterReturns MinisterOneYearDo();
Console.WriteLine("國王的命令:",king.KingsOrder);
//大臣A根據委托的簽名的所寫的方法傳給另壹個方法去處理
king.handleMinisterOneyearDo(MinisterA.MinisterAOneYearDo);
Console.ReadLine();
//大臣B根據委托的簽名的所寫的方法傳給另壹個方法去處理
king.handleMinisterOneyearDo(MinisterB.MinisterBOneYearDo);
Console.ReadLine();
//大臣C根據委托的簽名的所寫的方法傳給另壹個方法去處理
king.handleMinisterOneyearDo(MinisterC.MinisterCOneYearDo);
Console.ReadLine();
}
} 上面說過為什麽具體實現方法返回的值跟委托delegate返回的值不壹樣都可以呢?其實用到了委托中的協變,下面是引用MSDN中對委托中的協變的解析,當委托方法的返回類型具有的派生程度比委托簽名更大時,就稱為協變委托方法。因為方法的返回類型比委托簽名的返回類型更具體,所以可對其進行隱式轉換。這樣該方法就可用作委托。協變使得創建可被類和派生類同時使用的委托方法成為可能。