转型
先说说继承中的转型
参考
https://www.cnblogs.com/fuyouchen/p/9363989.html
https://blog.csdn.net/limlimlim/article/details/7817677
https://www.cnblogs.com/qixuejia/p/4383068.html
向上转型:将子类对象转为父类对象。此处父类对象可以是接口
转化后的父类对象具有父类所有方法,若方法被子类重写override,那么实际调用时,调用的是重写后的实现。
向下转型:把父类对象转为子类对象。
具有子类所有方法(包括重写方法)+父类所有方法(被重写的方法,按重写的算。)
抽象中的继承就是
向上转型时,转型后的对象只具有父类方法和子类对父类重新(实现)的方法。并没有子类自带的方法
协变和逆变
1.数组的协变
比如Animal 类 Dog继承于他
Animal[] animalArray = new Dog[]{};
2.委托的协变和逆变
1.协变
//Dog:Animal
public delegate Animal GetAnimal();
static Dog GetDog(){return new Dog();}
//GetDog的返回值是Dog, Dog是Animal的子类;
//返回一个Dog肯定就相当于返回了一个Animal;
//所以下面对委托的赋值是有效的
GetAnimal getMethod = GetDog;
2.逆变
//Dog:Animal
public delegate void FeedDog(Dog target);
static void FeedAnimal(Animal target){}
//FeedAnimal接受的参数是animal,Dog是可以隐式转变成Animal的
//所以委托可以安全的的做类型转换
FeedDog feedDogMethod = FeedAnimal;
3.泛型委托的协变和逆变
1.协变
//Dog:Animal
public delegate T Find<out T>();
Find<Dog> findDog = ()=>new Dog();
//类型T从Dog向Animal转变是协变
Find<Animal> findAnimal = findDog;
2.逆变
//Dog:Animal
public delegate void Feed<in T>(T target);
Feed<Animal> feedAnimalMethod = a=>Console.WriteLine(“Feed animal lambda”);
//因为在定义泛型委托时有in关键字,如果把in关键字去掉,编译器会认为不合法
Feed<Dog> feedDogMethod = feedAnimalMethod;
接口跟这个类似
也就是说可以再不知道是否传入有继承关系时候泛型方法的向转型,感觉和泛型约束能点出来差不多
也和传参in out差不多
协变必须有返回值 且不能当做参数传递
逆变不能有返回值
可以在一定程度上简化代码吧
之前有高手指点看这个,本来是想优化下我之前的消息分发,因为泛型太多了,结果还是不行