栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C#基础:泛型的接口抽象

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#基础:泛型的接口抽象

    一个比较有趣的问题:某程序在启动之前,需要对三种不同类型的数据的交叉引用(Cross Reference,xref)进行更新,现假设每种xref组件(xref component)都专门负责一种类型数据的交叉引用更新。交叉引用更新程序(XRefUpdator)在被构造的时候,会通过反射列举出当前assembly中的所有components,以便在更新的时候,逐一调用这些components的相应方法,完成对所有数据的更新。

    很明显,为了强化类型和扩展方便,我们会定义一个xref component的泛型类,泛型类型就是交叉引用数据(XRefData)。由此,出现如下定义:

?

1234567891011121314public interface IXRefData          {             // TODO: add definition here         }          public class XRefComponent             where Tdata: IXRefData         {             public void Update() { }        }          public class XRefPickdata: IXRefData { }        public class XRefPackdata: IXRefData { }

好了,现在考察XRefUpdator的定义。根据上面的设计思路,XRefUpdator需要包含一个xref component的列表,以便在需要的时候进行遍历从而逐一更新数据:

?

1234public class XRefUpdator   {       private List

 

    OK,到这里就傻眼了,上面的省略号部分不知道该怎么写,到底是XRefComponent还是XRefComponent,事实上两者都不是。由此引出了一个非常明显但又容易忽视的概念:泛型表达的是一组完全不同的类型。既然是不同的类型,我们也不可能将它们统一地装入一个列表当中。

    如何解决这样的问题?其实方法很简单,就是引入接口。废话不说了,看完下面的代码后,您就会豁然开朗:

?


public interface IXRefData             {                // TODO: add definition here            }     public interface IXRefComponent   {       void Update();   }            public class XRefComponent : IXRefComponent       where Tdata: IXRefData            {                public void Update() { }            }             public class XRefPickdata: IXRefData { }           public class XRefPackdata: IXRefData { }          public class XRefUpdator   {     private List components = new List();      public XRefUpdator     {       foreach(Type type in this.GetType().Assembly.GetExportedTypes())       {         if (typeof(IXRefComponent).IsAssignableFrom(type))         {           components.Add((IXRefComponent)Activator.CreateInstance(type));         }       }     }  

 

    到这里,我想您应该觉得事情已经结束了。事实上并非如此。如果XRefComponent类中的Update方法需要用到TData类型的参数,或者返回值是TData类型,那么,你就无法简单地使用IXRefComponent接口去做抽象,因为你没有办法在这个接口中定义Update方法。如果你使用泛型接口,那又到了问题的起点:你遇到的是一堆完全不同的接口。在后续的文章中,我会介绍如何解决这个问题。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/231828.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号