委托(二)-协变和逆变

委托中的协变和逆变
概诉:
在将委托方法与委托签名匹配时协变和逆变为委托提供了一定程度的灵活性
1. 什么时协变
当委托方法的返回类型具有的派生程度比委托签名更大时,就称为协变委托方法,
通俗的将就是委托返回的类型有子类的签名就称为协变委托,所以可对其进行隐式转换,那么协变使得创建可被类和派生类同时使用的委托方法成为可能。
Dome :一下实例可清晰的看出一个委托可被类和其派生类一起调用
public class Human
{
protected string name;
public Human() { }
public Human(string n)
{
name = n;
}
public string Name
{
get { return name; }
set { name = value; }
}
}
public class Asian : Human
{
public Asian(string name)
: base(name)
{ }
}
class Program
{
public delegate Human GetClass();
static void Main(string[] args)
{
#region 协变
GetClass man = new GetClass(GetNewHuman);
man();
GetClass asian = new GetClass(GetNewAsian);
asian();
#endregion
Console.ReadLine();
}
static Human GetNewHuman()
{
Human man= new Human(" 我是人类" );
Console.WriteLine(man.Name);
return man;
}
static Asian GetNewAsian()
{
Asian asian = new Asian(" 我是亚洲人" );
Console.WriteLine(asian.Name);
return asian;
}
}
2. 什么时逆变
当委托方法签名具有一个或多个参数,并且这些参数的类型派生自方法参数的类型时,就称为逆变委托方法。因为委托方法签名参数比方法参数更具体,因此可以在传递给处理程序方法时对它们进行隐式转换。这样可以通过同一个委托创建不同类型的方法参数类型的委托方法
Dome: 下面代码逆可以清晰的看到用 GetMan 方法调用 HandlerMan 和Asians不同参数的方法。
using System;
using System.Collections.Generic;
using System.Text;
namespace DelegaterDome
{
class Program
{
public delegate void GetMan(Asian asian);
static void Main(string[] args)
{
#region 逆变
//Human human = new Human(" 我是人类");
Asian asian1= new Asian(" 我是亚洲人" );
GetMan getMan = HandlerMan;
getMan(asian1);
GetMan getMan1 = Asians;
getMan1(asian1);
#endregion
Console.ReadLine();
}
static void HandlerMan(Human human)
{
Console.WriteLine(human.Name);
}
static void Asians(Asian asian)
{
Console.WriteLine(asian.Name);
}
}
}

你可能感兴趣的:(委托(二)-协变和逆变)