虽然有点蠢。假设有个父类 A
class A {
private int a;
public A(){}
/* get set 方法略,下同 */
}
子类 B
class B extends A {
private int b;
public B() {}
}
现有个 genA() 方法生成 A,需要把 A 转成 B,有几个修改条件或限制: B 必须是 A 的子类。A 不可修改。不可在 B 的构造函数中给 a 属性赋值(因为实际上 A 的属性很多,有的不一定有 set 方法,这里只列了一个)。除此之外 B 可以随意修改。B 的属性全为空也没关系。
感觉没什么好方法了。简单来说就是,请求返回了一个Response对象(A),我想要扩展这个对象,增加一个方法getJson 把 Response 的 content 转成 Json,可能以后还会有其它的扩展。当然有一些妥协的办法。比如
class B {
private A ac;
private int b;
public B(A a) {this.ac = a;}
}
直接把A变成B的成员,调用A的成员a的时候就是 new B().getAc().getA(); ,但是比较麻烦不优雅。
1
leafin 2018-06-05 11:06:49 +08:00
用反射吧,修改访问修饰符后再设置值
|
2
Bryan0Z 2018-06-05 11:10:17 +08:00 via Android
B.seta(A.geta())?
大概这个意思 B 里面写个方法,一个个赋值? 其实我觉得你想做的是在 B 里面加一个域,而不是用父类和子类 A a; public setA(A a) |
3
micean 2018-06-05 11:17:32 +08:00
fromJson(toJson(Parent), Child.class)
|
4
jinhan13789991 2018-06-05 14:26:44 +08:00
楼主你们服务器是不是同一个接口返回内容不同啊?比如同样登录,有时候返回 A 的结构,有时候返回 B 的结构?
如果结果返回格式固定,可以直接定义 java 实体,接受到结果直接从 json 转成对象。 如果返格式不固定,请锤死后台 |
5
xbigfat 2018-06-05 15:38:20 +08:00
为什么会有这么奇怪的业务需求,下转型本来就是很不安全的
|
6
v2dead 2018-06-05 16:19:54 +08:00
增加一个 A 的构造函数,参数是 A 类型的,增加一个 B 的构造函数,参数是 A 类型的,然后在 B 的构造函数里面调用父类的构造函数,你得到了一个扩展 B。
|
7
wysnylc 2018-06-05 16:24:51 +08:00
@jinhan13789991 #4 大锤 80
|
8
MrFireAwayH 2018-06-05 18:16:33 +08:00
我在 C#那边有类似情况 我的做法是
1. 做个 爷爷类 Universal 2. 做个 父类 A 继承 爷爷 3. 做个 子类 B 继承 A 4. 这样 A B 就可以互相转换了 太久没写 Java 惹 不知道靠谱不~ |
9
3pmtea 2018-06-05 19:51:59 +08:00
我觉得把 B 实现为装饰器的思路基本没错,觉得不优雅的话,你可能需要把 A 的 getter 也放在 B 里,或者做个 IResponse 接口让 B (甚至是 A )继承
|
10
shalk 2018-06-05 22:22:17 +08:00
可以不用继承,前面我以为是只是扩展属性,你可以再定义一遍 B,用 copyproperties 之类的拷贝属性就可以了。
后面 new B().getAc().getA(); 你可以给 B 定义一个 getA(), ``` class B { private A ac; private int b; public B(A a) {this.ac = a;} public int getA() { return ac.getA(); } } ``` |
11
SoloCompany 2018-06-05 22:48:50 +08:00 via iPhone
典型的 composite 优于继承的案例,包装器( decorate )也是一种特殊的 composite
|