
虽然有点蠢。假设有个父类 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 Jun 5, 2018 用反射吧,修改访问修饰符后再设置值 |
2 Bryan0Z Jun 5, 2018 via Android B.seta(A.geta())? 大概这个意思 B 里面写个方法,一个个赋值? 其实我觉得你想做的是在 B 里面加一个域,而不是用父类和子类 A a; public setA(A a) |
3 micean Jun 5, 2018 fromJson(toJson(Parent), Child.class) |
4 jinhan13789991 Jun 5, 2018 楼主你们服务器是不是同一个接口返回内容不同啊?比如同样登录,有时候返回 A 的结构,有时候返回 B 的结构? 如果结果返回格式固定,可以直接定义 java 实体,接受到结果直接从 json 转成对象。 如果返格式不固定,请锤死后台 |
5 xbigfat Jun 5, 2018 为什么会有这么奇怪的业务需求,下转型本来就是很不安全的 |
6 v2dead Jun 5, 2018 增加一个 A 的构造函数,参数是 A 类型的,增加一个 B 的构造函数,参数是 A 类型的,然后在 B 的构造函数里面调用父类的构造函数,你得到了一个扩展 B。 |
7 wysnylc Jun 5, 2018 @jinhan13789991 #4 大锤 80 |
8 MrFireAwayH Jun 5, 2018 我在 C#那边有类似情况 我的做法是 1. 做个 爷爷类 Universal 2. 做个 父类 A 继承 爷爷 3. 做个 子类 B 继承 A 4. 这样 A B 就可以互相转换了 太久没写 Java 惹 不知道靠谱不~ |
9 3pmtea Jun 5, 2018 我觉得把 B 实现为装饰器的思路基本没错,觉得不优雅的话,你可能需要把 A 的 getter 也放在 B 里,或者做个 IResponse 接口让 B (甚至是 A )继承 |
10 shalk Jun 5, 2018 可以不用继承,前面我以为是只是扩展属性,你可以再定义一遍 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 Jun 5, 2018 via iPhone 典型的 composite 优于继承的案例,包装器( decorate )也是一种特殊的 composite |