泛型继承中,如何在子类中直接访问泛型类中的数据

问题描述

假设我创建了一个类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{}

试试看就知道了。

时间: 2024-11-03 11:45:06

泛型继承中,如何在子类中直接访问泛型类中的数据的相关文章

如何用手机访问电脑中的网页

问题描述 如何用手机访问电脑中的网页 如何用手机访问电脑中的网页,( http:// + 本地IP )记不太清,求指教,谢谢 解决方案 电脑上需要安装和部署web服务器(比如iis或者apache),把你的网页上传上去 绑定本地ip和端口(默认80端口) 防火墙允许这个端口 手机和pc在同一个网段,手机输入 http://pc的ip:端口号 (如果是80端口,可以不写端口号) 解决方案二: 什么意思? 直接打开网页不是更好? 解决方案三: 输入allchips 解决方案四: 1.直接的网址录入手

转型-关于如何通过子类调用父类的父类中的方法

问题描述 关于如何通过子类调用父类的父类中的方法 package access; class A{ public A(){System.out.println("A created!");} public int f(){ System.out.println("call A.f()"); return 1; } } class B extends A{ public int f(){ System.out.println("call B.f()"

大家都来说说安卓java中什么是向上转型?请问安卓中的向上转型的用途是什么?

问题描述 大家都来说说安卓java中什么是向上转型?请问安卓中的向上转型的用途是什么? 大家都来说说安卓java中什么是向上转型?请问安卓中的向上转型的用途是什么? 解决方案 http://blog.csdn.net/shanghui815/article/details/6088588 解决方案二: 向上转型 就是子类对象指向父类引用:父类引用无法使用子类对象特有得方法 就需要转化成子类类型 这就是向下转型. 这个也是面向对象编程的里氏替换原则,开发中推荐面向抽象编程,即定义变量的基本类型是抽

iOS重写父类中的方法时要先调用父类中的方法的原因

现有两个类: 1.Object001继承自NSObject #import <Foundation/Foundation.h>   @interface Object001 : NSObject   //Object001的头文件,我只是在这里面声明了个方法 -(void)printfString;   @end   #import "Object001.h"   @implementation Object001   //Object001的实现文件,我实现了声明的pri

初学者对于java继承、多态,子类对象的内存分配的一些问题,百度了好多,但感觉没有系统的,在此提问,希望前辈们传到授业解惑

问题描述 由于是初学者,所以有些表述可能有误,都只是自己的一些理解.我是纯初学者,看过两个星期的C++,之前也学过C.感觉看C++的时候,更容易去理解C++中的面向对象技术的实现,但看JAVA的时候,可能隔着一层虚拟机,有些实现很难理解.第一个问题:我了解到一个对象里面,隐含了一个引用this,可以用this来特别地引用本对象的成员或者函数,然后还有一个super关键字,书上说这个关键字不是一个引用,但怎么看都感觉这个super是一个指向本对象的父类类型的引用.我想问这个super到底是什么,如

在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持

在我们开发很多项目中,数据访问都是必不可少的,有的需要访问Oracle.SQLServer.Mysql这些常规的数据库,也有可能访问SQLite.Access,或者一些我们可能不常用的PostgreSQL.IBM DB2.或者国产达梦数据库等等,这些数据库的共同特点是关系型数据库,基本上开发的模型都差不多,不过如果我们基于ADO.NET的基础上进行开发的话,那么各种数据库都有自己不同的数据库操作对象,微软企业库Enterprise Library是基于这些不同数据库的操作做的抽象模型,适合多数据

swing-一个JPanel中的按钮点击后往另一个JPanel中添加一个JTextField

问题描述 一个JPanel中的按钮点击后往另一个JPanel中添加一个JTextField 我现在实现的是有一个Class A里面是初始化窗体的,然后通过JSplitPane将窗体分成左右两部分,左边部分是new Class B,B是继承JScrollPane的,右半部分是装的Class C,C也是继承JPane,现在要实现的就是B中有一个按钮,点击这个按钮的时候往C中添加一个JTextField,现在的问题是不知道如何取得C ,我直接在B的按钮监听中new一个C的面板添加JTextField后

C#如何将一个方法公开出去,先在一个类库中声明生成dll后,在主程序中实现,求如何实现

问题描述 C#如何将一个方法公开出去,先在一个类库中声明生成dll后,在主程序中实现,求如何实现 就是主程序的一个方法 继承类库声明的方法后 通过类库生成的dll公开出去,主程序要如何让实现类库中声明的方法 解决方案 插件引用主程序可以了,也可以做一个公共的dll,插件和主程序都引用它. 在这个dll或者主程序中定义接口或者抽象类,在插件中实现或者继承

【求助】派生类中的函数访问基类同名数据成员的问题

问题描述 /*2008年5月20日14:28:54派生类中的函数访问基类同名数据成员的问题*/usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespace继承_同名覆盖问题{classProgram{classA{publicinta=10;}classB:A{newpublicinta=2;//B类的a"覆盖"了基类的apublicvoidf(){Console.WriteLine(a);//请问如何在本