问题描述
假设我创建了一个类A,并假设类A中定义了许多属性和函数publicclassA{publicintproperty1{get;set;}publicfloatproperty2{get;set;}publicboolproperty3{get;set;}......}假设有一个泛型基类:GenericBase<T>publicclassGenericBase<T>whereT:A{}然后我创建一个新类GenericA继承上面的泛型类publicclassGenericA:GenericBase<A>{}测试假设创建了一个GenericA对象testGenericAtest=newGenericA();我如何实现在test中可以直接调用A中的属性或函数呢?就好像GenericA和A之间有继承关系一样?比如这样:test.property1;但是很显然这样写是不允许的?有没有什么办法实现这样的功能呢?我想过在GenericA中重写一次类A的属性,比如这样(修改之后的代码):publicclassA{publicintproperty1{get;set;}publicfloatproperty2{get;set;}publicboolproperty3{get;set;}......}publicclassGenericBase<T>{publicGenericBase(Tobj){a=obj;}publicAa{get;set;}}publicclassGenericA:GenericBase<A>{publicintproperty1{get{returna.property1;}set{a.property1=value;}}publicfloatproperty2{get{returna.property2;}set{a.property2=value;}}publicintproperty3{get{returna.property3;}set{a.property3=value;}}......}再次创建一个对象testGenericAtest=newGenericA();此时test.property1这样的语句就合法了,并且就像GenericA和A有继承关系一样。可是这样写的话对于A中的每一个函数,属性,我都得在GenericA里面重新写一遍,效率很低。所以请教一下,有更好的办法吗?还是说我的理解本身有问题?
解决方案
解决方案二:
引用楼主u013616456的回复:
并且就像GenericA和A有继承关系一样
不管是GenericA还是GenericBase<A>,和A之间完全没有继承关系
解决方案三:
要么继承AclassGenericA:A要么把所有方法重写一遍
解决方案四:
publicclassGenericBase<T>{protectedTmyobj;//加个变量保存这个T的实例给子类用。publicGenericBase(Tobj){myobj=obj;}publicAa{get;set;}}
解决方案五:
你想太多了,泛型跟类型参数之间没有继承关系,类型参数只是泛型的一个约束,仅此而已
解决方案六:
有继承关系的话,你就可以通过泛型约束来指定类型,这样方法就知道这个t应该是什么类的
解决方案七:
泛型并不是通常的继承,如果要访问那些属性,还是需要内部存有T类型的变量
解决方案八:
楼主想要的是“间接继承”间接继承,楼主其实见过。DbConnection,CreateCommand()得到DbCommandSqlConnection.CreateCommand()得到SqlCommandSqlConnection继承自DbConnection,但是CreateCommand()返回的结果却不同。————————————————————————楼主自己反编译DbConnection就能得到想要的答案。
解决方案九:
算了,还是手写一段代码吧。publicclassParentClass{publicobjectValue{get;set;}}publicclassChildClass<T>:ParentClass{publicnewTValue//重写同名函数{get{return(T)base.Value;}set{base.Value=value;}}}
这里只是“属性”的间接继承,“函数”的间接继承复杂的多——这点,你真的得参考SqlConnection和DbConnection的关系了。
解决方案十:
嗯是的,代码publicclassGenericBase<T>whereT:A这里设计出了概念问题。这个GenericBase并不从A继承。
解决方案十一:
如果你想表达继承关系,应该这样写publicclassGenericBase<T>:AwhereT:A{}
试试看就知道了。