//假设有
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。
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。
解决方案 »
- 关于tomcat启动报错的问题。
- 大家讨论下线程的问题啊,都发表下意见嘛(有实例)
- 哪位知道java的Runtime运行可执行程序的时候,可执行程序是否受JDK的约束?
- 如何判断一个字符串只有数字(0123456789)和运算符(+-*/^%)
- 基础问题java.lang.NoSuchMethodError: main什么意思啊?
- 有没有办法加快Java数据库应用client端的数据显示呢?
- 请帮我分析一下这道题~~~~~~~~~
- 征集APPLET代码!
- 防止反编译的功能
- Applet对本地资源是不能访问的,那如果我要用Applet做打印设计,那如何是好呢??
- 求助:求一个不定数组中的最小值
- 删除不了的
super(a,b,c,d,e,f);
this.Id=intId;
}
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;}
}
但这样好像就破坏我的设计初衷了。
第二种是关于继承(Inheritance)和组合(Composition)的选择问题,这要根据具体需求而定,但就代码来讨论这个问题没有意义。
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:有点像初学编程时追求变量名可变的情况,后来才发现用数组或者字典就可以。
人 有子类 男人和女人
扩展类就可以转化为基类 男人和女人都是人
反过来就不行 人不一定是男人,也不一定是女人,只有原来是男人的人才能转换成男人
CBase bas=new CExtend(a,b,c,d);
CExtend ext=(CExtend)bas;