V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lxy
V2EX  ›  Java

怎么把父类转成子类?

  •  
  •   lxy · 2018-06-05 10:58:19 +08:00 · 5869 次点击
    这是一个创建于 2362 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  2018-06-05 12:27:21 +08:00

    感觉没什么好方法了。简单来说就是,请求返回了一个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(); ,但是比较麻烦不优雅。

    11 条回复    2018-06-05 22:48:50 +08:00
    leafin
        1
    leafin  
       2018-06-05 11:06:49 +08:00
    用反射吧,修改访问修饰符后再设置值
    Bryan0Z
        2
    Bryan0Z  
       2018-06-05 11:10:17 +08:00 via Android
    B.seta(A.geta())?
    大概这个意思
    B 里面写个方法,一个个赋值?

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

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

    太久没写 Java 惹 不知道靠谱不~
    3pmtea
        9
    3pmtea  
       2018-06-05 19:51:59 +08:00
    我觉得把 B 实现为装饰器的思路基本没错,觉得不优雅的话,你可能需要把 A 的 getter 也放在 B 里,或者做个 IResponse 接口让 B (甚至是 A )继承
    shalk
        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();
    }
    }
    ```
    SoloCompany
        11
    SoloCompany  
       2018-06-05 22:48:50 +08:00 via iPhone
    典型的 composite 优于继承的案例,包装器( decorate )也是一种特殊的 composite
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5265 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:26 · PVG 16:26 · LAX 00:26 · JFK 03:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.