> 电脑数码
泛型方式(泛型的使用方法)
导语:泛型如何进行隐式转换在对象之间,我们通过多态进行创建对象,父类编译,子类运行,从而达到代码上的复用性与解耦性。但我们发现在泛型中List<>限制的类型,我们不能类似的通过多态来进行编译运行:List<BaseA> list = new List<SubA>();发现会出现如下错误1.为什么使用此方式2.该如何解决3.为什么出现这种现象以目前我遇到的情况来说,避免了方法的重载,且方法实现方式却是一样的,如果不能通过上述形式,那么我们将必须使用方法的重载,仅因为传递参数类型不同,而写入过多的相同代码。如下面代码形式:class Program{static void Main(string[] args){//定义父类对象BaseA baseA;SubA subA = new SubA();//父类获得方法返回值,参数为子类对象baseA = TestObject(subA);SubB subB = new SubB();//避免了方法的重载baseA = TestObject(subB);//我们在泛型中希望像多态一般实现避免方法的重载,但事实上它出现了以下显示的错误List<SubA> subAList = new List<SubA>();TestList(subAList);//错误点Console.ReadKey();}private static List<BaseA> TestList(List<BaseA> list){List<BaseA> listBase = new List<BaseA>();for (int i = 0; i < list.Count; i++){listBase.Add(list[i]);}return listBase;}private static BaseA TestObject(BaseA baseA){return baseA;}}class BaseA { }class SubA :BaseA{ }class SubB : BaseA { }为什么使用此方式?所以我希望如多态一般,开放参数接口的范围,达到代码的复用性质。我们希望在方法中接收的参数能够是一个通用的参数,在调用该方法时,无论你传递什么参数进来,都是能够运行我这个方法的。如在传递对象来时,我们在方法定义参数类型是父类型,在调用该方法时,将子类型传递给它,方法依然能够正常运行。所以我们希望,在传递泛型时,也能够利用向上转型机制,达到我们想要的目的。在解决问题中,我们也可以将参数采用object作为替代,但毫无疑问,我们将面临装箱与拆箱之间的性能损失。而若是使用泛型,在哪个对象调用该方法时,把已知的对象告诉它,让它的对象也做出相应的改变,便是我们想要避免的问题能够得到解决。如何解决问题?在java中,可以发现,可以使用通配符或者声明为T类型来操作完成。可以发现,在调用方法TestList时候,我们可以传递任何对象进来,且不需要是否拥有继承关系,因为在声明泛型时,只能等价声明,不能隐式作为转换。我们希望C也能以类似的方式达到此效果。泛型类:public class ListClass<T>{public static void GetList(List<T> list){}}方法上的泛型private static void GetList<T>(List<T> list){}结果上来看,我们达到了一致效果。为什么出现这种现象?在过程中最让我疑惑的便是,在泛型容器里设置的类型为什么不能像单个的对象一般,具有多态关系。在看java的过程中,也逐一解惑了,在使用中只能对其容器进行判别,而容器内部的属性是未知的。 在之后也有了一些感悟,在编写代码过程中,一开始仅仅在变量上进行操作,后来将这统一行为规范到方法,然后发现方法只能接收同一种类型的变量,仍然存在局限性,就存入了多态的父类,调用时传入子类参数,发现使用范围更广,如果直接用最基本的基类object,那么对于同一种行为的所有对象都可以使用此方法,但是我们会发现,这样没有了约束性,面临装箱与拆箱之间的性能损耗,这时候就引用了泛型,修改传进来的对象类型,达到一致效果。思路历程以上纯属个人观念想法,泛型还有很多不懂的地方,希望能帮忙修正出来,谢谢。
免责声明:本站部份内容由优秀作者和原创用户编辑投稿,本站仅提供存储服务,不拥有所有权,不承担法律责任。若涉嫌侵权/违法的,请反馈,一经查实立刻删除内容。本文内容由快快网络小媛创作整理编辑!