实例化的问题。在线等待
日期:2006-10-02 荐:
实例化的问题。在线等待有以下的类:public class class1{}public class class2:Class1{}public class class3:Class1{}public class cc{ main() { Class1 c1=new class2(); //当我不知道c1是被哪个类继承的(class2或者class3都有可能),我该怎么去new 一个c1? //比如我要把c1加到ArrayList里面 ArrayList al=new ArrayList(); for(int i=0;i<=10;i ) { //实例化C1 c1=new class2();//但是有时候这个C1是class3的 al.add(c1); } }}什么意思?你写了类,不知道是怎么继承的?不是。我重新写个main函数。mian(){ Class1 c1=new class2(); //调用函数 ADDin(c1); //这样调用的话就错了。。。。。。。。。。。。。 Class1 c2=new class3(); ADDin(c2); }//子函数public void ADDin(Class1 tt){ ArrayList al=new ArrayList(); for(int i=0;i<=10;i ) { //实例化C1 c1=new class2();//但是有时候这个C1是class3的,在这里怎么实例化 al.add(c1); }}还是没明白你的意思,用接口 ???好象思路不对,一般继承会不知道父类??就是说我要把继承于class1类的实例存入Arraylist里面去。然后通过foreach(class2 c2 in AL){}或者foreach(class3 c3 in AL){}来访问数据。但是在给ArrayList.Add方法时必须先实例化,比如:for(int i=0;i<=10;i ){ //实例化C1 c1=new class2();//但是有时候这个C1是class3的,在这里怎么实例化 al.add(c1);}但是有时候却是for(int i=0;i<=10;i ){ //实例化C1 c1=new class3();//这里不同 al.add(c1);}如果用for(int i=0;i<=10;i ){ //实例化C1 c1=new class1();//请看这里 al.add(c1);}在用foreach遍历数据的时候就有问题了。。那你在add的时候应该知道什么时候是class2,什么时候是class3,根据不同条件new出不同对象,如果这都不知道,那我也没办法了。这个问题比较复杂涉及到 多态和静态绑定,动态绑定首先要分清楚引用变量的类型和对象的类型一个对象和用来访问此对象的引用变量可以基于不同的类型,但引用变量的类型必须与这个对象的类型相兼容.基类和派生类无疑是兼容的静态绑定:编译时确定对象的类型.引用变量的类型决定对象的类型动态绑定:运行时确定对象的类型.引用变量的类型和被引用的对象的类型可以不同,但要兼容当你不知道将要被引用的对象的类型时,可以声明个于之兼容类型的引用变量public class class1{}public class class2:Class1{}public class class3:Class1{}public class cc{ ArrayList al=new ArrayList(); //假设这个al来存放Class1类型对象 main() { class1 c1=new class2();//c1是基类class1类型的引用变量,它可以引用所有派生类的对象,所以不管这里你new一个什么class2 还是class3类型的对象都没关系 //实例化C1 c1=new class2(); al.addin(c1); //Class2于Class1是类型兼容的可以存入al中 al.addin(new class3); //class3类型的对象同样也可以存入al class3 c3 = (class3)al.Item[1] //用时做下转换 }public void addin(Class1 tt) { al.add(tt); }}}:( 并不是我想要。我还是写详细一点public class class1{}public class class2:Class1{ string userid; public string UserId { set{userid=value;} get{return userid;} }}public class class3:Class1{ string title; public string Title { set{title=value;} get{return title;} }}public class Test{ main() { ArrayList al=new ArrayList(); InserList(ref al,new class2()); } public void InserList(ref ArrayList al,class1 cc) { Type objType; PropertyInfo prop; objType =cc.GetType(); /*数据库操作省了*/ SqlDataReader sqlDr=currentCmd.ExecuteReader(); while(sqlDr.Read()) { //这里肯定要重新实例化cc一次,否则加入ArrayList里面的数据都是一样的 //?????????????????????????/// //关键在这里,怎么样实例化cc?? for(int i=0;i<sqlDr.FieldCount;i ) {prop = objType.GetProperty( sqlDr.GetName(i));prop.SetValue(cc, sqlDr[i].ToString(), null ); } Al.Add(cc); } }}你可以在class1里面写一个方法叫做public class1 New(){ return new class1();}然后在重新实例化的时候用 cc = cc.New();哈哈。。终于找到解决办法啦。。谢谢sunjian_qi(sonne) 提醒了我。。分就给你咯。。谢谢public abstract class class1{ public abstract PersistableObject New();//抽象类
}public class class2:Class1{ string userid; public string UserId { set{userid=value;} get{return userid;} } public override class1 New() { return new class2(); }}public class class3:Class1{ string title; public string Title { set{title=value;} get{return title;} } public override class1 New() { return new class3(); }}public class Test{ main() { ArrayList al=new ArrayList(); InserList(ref al,new class2()); } public void InserList(ref ArrayList al,class1 cc) { Type objType; PropertyInfo prop; objType =cc.GetType(); /*数据库操作省了*/ SqlDataReader sqlDr=currentCmd.ExecuteReader(); while(sqlDr.Read()) { //这里肯定要重新实例化cc一次,否则加入ArrayList里面的数据都是一样的 //这里就OK了 cc.New() for(int i=0;i<sqlDr.FieldCount;i ) {prop = objType.GetProperty( sqlDr.GetName(i));prop.SetValue(cc, sqlDr[i].ToString(), null ); } Al.Add(cc); } }}
标签: