怎么把父类转成子类?

2018-06-05 10:58:19 +08:00
 lxy

虽然有点蠢。假设有个父类 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 的属性全为空也没关系。

5704 次点击
所在节点    Java
11 条回复
leafin
2018-06-05 11:06:49 +08:00
用反射吧,修改访问修饰符后再设置值
Bryan0Z
2018-06-05 11:10:17 +08:00
B.seta(A.geta())?
大概这个意思
B 里面写个方法,一个个赋值?

其实我觉得你想做的是在 B 里面加一个域,而不是用父类和子类
A a;
public setA(A a)
micean
2018-06-05 11:17:32 +08:00
fromJson(toJson(Parent), Child.class)
jinhan13789991
2018-06-05 14:26:44 +08:00
楼主你们服务器是不是同一个接口返回内容不同啊?比如同样登录,有时候返回 A 的结构,有时候返回 B 的结构?
如果结果返回格式固定,可以直接定义 java 实体,接受到结果直接从 json 转成对象。
如果返格式不固定,请锤死后台
xbigfat
2018-06-05 15:38:20 +08:00
为什么会有这么奇怪的业务需求,下转型本来就是很不安全的
v2dead
2018-06-05 16:19:54 +08:00
增加一个 A 的构造函数,参数是 A 类型的,增加一个 B 的构造函数,参数是 A 类型的,然后在 B 的构造函数里面调用父类的构造函数,你得到了一个扩展 B。
wysnylc
2018-06-05 16:24:51 +08:00
@jinhan13789991 #4 大锤 80
MrFireAwayH
2018-06-05 18:16:33 +08:00
我在 C#那边有类似情况 我的做法是

1. 做个 爷爷类 Universal
2. 做个 父类 A 继承 爷爷
3. 做个 子类 B 继承 A
4. 这样 A B 就可以互相转换了

太久没写 Java 惹 不知道靠谱不~
3pmtea
2018-06-05 19:51:59 +08:00
我觉得把 B 实现为装饰器的思路基本没错,觉得不优雅的话,你可能需要把 A 的 getter 也放在 B 里,或者做个 IResponse 接口让 B (甚至是 A )继承
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();
}
}
```
SoloCompany
2018-06-05 22:48:50 +08:00
典型的 composite 优于继承的案例,包装器( decorate )也是一种特殊的 composite

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/460488

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX