//假设有
class CBase {
  int a,b,c,d,e
  public CBase(a,b,c,d,e,f){........}  
  //不支持CBase();
}//设计一个派生类,他唯一的新增属性就是Id
class CExtend extends CBase{
  int Id;
  CExtend (int intId,CBase bas){???} //问题在此
}
如何写这个构造函数呢?我现在用CExtend (int intId,CBase bas){
   super(bas.a,bas.b,bas.c,bas.c.......);
      this.Id=intId; 
}
这种写法有两个毛病
1、就是必须调用原来super的构造函数逐一输入赋值
2、CExtend完全复制了一个CBase,但是我不需要完全复制,我只要有Id就可以了,其他可以指向构造时用得CBase bas。

解决方案 »

  1.   

    CExtend (int intId, int a, int b, int c, int d, int e, int f) {
      super(a,b,c,d,e,f);
      this.Id=intId;
    }
      

  2.   

    必须用CExtend (int intId,CBase bas)这个构造函数,或者别的办法有CBase bas直接创建CExtend.1楼的办法和我叙述的一样,都必须super(a,b,c,d...),要重复复制
      

  3.   

    要构造CExtend,就必须先构造CBase。而CBase(a,b,c,d,e,f)是CBase的唯一构造函数,所以你没有其他的选择。
      

  4.   

    为什么扩展类就可以转化为基类,反过来就不行呢?我的目标是实现下面的样子
    CBase bas=new CBase(a,b,c,d);
    CExtend ext=(CExtend)bas;   //报错 can't case to extend
    ext.Id=123;
    或者
    CBase bas=new CBase(a,b,c,d);
    CExtend ext=new CExtend(123,bas);  //最好不用完全复制bas当然也可以不用扩展而改成
    class CExtend{
     public  CBase bas;
     int Id;
     CExtend(int intId,CBase bas){Id=intId;this.bas=bas;}
    }
    但这样好像就破坏我的设计初衷了。
      

  5.   

    我想你要表达是一种“动态类”的思想,不过遗憾地告诉你,Java不支持这种特性。
    第二种是关于继承(Inheritance)和组合(Composition)的选择问题,这要根据具体需求而定,但就代码来讨论这个问题没有意义。
      

  6.   

    感谢回复。如果采用
    class CExtend{
     public  CBase bas;
     int Id;
     CExtend(int intId,CBase bas){Id=intId;this.bas=bas;}
    }
    的办法,所有方法就得重写,失去重用的好处如果采用
    CExtend (int intId,CBase bas){
       super(bas.a,bas.b,bas.c,bas.c.......);
          this.Id=intId; 
    }
    //or
    CExtend (int intId, int a, int b, int c, int d, int e, int f) {
      super(a,b,c,d,e,f);
      this.Id=intId;
    }
    就得复制全部数据,如果数据很大就太次亏了
    初学,不知道其他途径可以实现一样的要求,还请大家帮忙指点方向。ps:有点像初学编程时追求变量名可变的情况,后来才发现用数组或者字典就可以。
      

  7.   


    人 有子类 男人和女人
    扩展类就可以转化为基类    男人和女人都是人 
    反过来就不行    人不一定是男人,也不一定是女人,只有原来是男人的人才能转换成男人
    CBase bas=new CExtend(a,b,c,d);
    CExtend ext=(CExtend)bas;