using UnityEngine;
using System.Collections;
// Contravariant interface.
interface IContravariant<in A> { }
// Extending contravariant interface.
interface IExtContravariant<in A> : IContravariant<A> { }
// Implementing contravariant interface.
class Sample<A> : IContravariant<A> { }
public class AC{
}
public class BC:AC{
}
public class xb : MonoBehaviour {
public delegate void DContravariant<in A>(A argument);
// Methods that match the delegate signature.
public static void SampleControl(AC control)
{ }
public static void SampleButton(BC button)
{ }
public void Tests()
{
// Instantiating the delegates with the methods.
DContravariant<AC> dControl = SampleControl;
DContravariant<BC> dButton = SampleButton;
dControl (new AC());
dButton (new BC());
dControl (new BC());
// You can assign dControl to dButton
// because the DContravariant delegate is contravariant.
dButton = dControl;
//error:
//dControl = dButton;
// Invoke the delegate.
//参数必须与dButton定义的类型相同,否则会报错
dButton(new BC());
}
static void Test()
{
IContravariant<AC> iobj = new Sample<AC>();
IContravariant<BC> istr = new Sample<BC>();
// You can assign iobj to istr because
// the IContravariant interface is contravariant.
istr = iobj;
//error: Assets/_Test/xb.cs(39,17): error CS0266: Cannot implicitly convert type `IContravariant<BC>' to `IContravariant<AC>'. An explicit conversion exists (are you missing a cast?)
//iobj = istr;
AC ac = new AC ();
BC bc = new BC ();
ac = bc;
//error:annot implicitly convert type `AC' to `BC'. An explicit conversion exists (are you missing a cast?)
//ac = bc;
}
}
泛型接口:子类实现的泛型接口指向父类实现的泛型接口需逆变(in),父类实现的接口指向子类实现的接口需协变(out)
泛型委托:子类泛型委托变量指向父类泛型委托变量需逆变,父类委托指向子类委托需协变(貌似无法协变)