基于.Net中的协变与逆变的深入分析(2)


IFeedable<Dog> feedDog = new FeedImp<Animal>();


上面的代码将FeedImp<Animal>类型赋值给了IFeedable<Dog>的变量;Animal向Dog转变了,所以是逆变
2.泛型接口中的协变
如下接口的定义:

复制代码 代码如下:


public interface IFinder<out T>
{
    T Find();
}


泛型接口的泛型T之前用了out关键字来说明此接口是可能要做协变的;如下泛型接口实现类

复制代码 代码如下:


public class Finder<T>:IFinder<T> where T:new()
{
    public T Find(){
        return new T();
    }
}
//使用协变,IFinder的泛型类型是Animal,但是由于有out关键字,我可以将Finder<Dog>赋值给它
IFinder<Animal> finder = new Finder<Dog>();


协变和逆变的概念不太容易理解,可以通过实际代码思考理解。这么绕的东西到底有用吗?答案是肯定的,通过协变和逆变可以更好的复用代码。复用是软件开发的一个永恒的追求。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjgxgf.html