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

怎么把父类转成子类?

  •  
  •   lxy · 70 天前 · 2076 次点击
    这是一个创建于 70 天前的主题,其中的信息可能已经有所发展或是发生改变。

    虽然有点蠢。假设有个父类 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 条附言  ·  70 天前

    感觉没什么好方法了。简单来说就是,请求返回了一个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
        1
    leafin   70 天前
    用反射吧,修改访问修饰符后再设置值
        2
    Bryan0Z   70 天前 via Android
    B.seta(A.geta())?
    大概这个意思
    B 里面写个方法,一个个赋值?

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

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

    太久没写 Java 惹 不知道靠谱不~
        9
    3pmtea   70 天前
    我觉得把 B 实现为装饰器的思路基本没错,觉得不优雅的话,你可能需要把 A 的 getter 也放在 B 里,或者做个 IResponse 接口让 B (甚至是 A )继承
        10
    shalk   70 天前
    可以不用继承,前面我以为是只是扩展属性,你可以再定义一遍 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   70 天前 via iPhone
    典型的 composite 优于继承的案例,包装器( decorate )也是一种特殊的 composite
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   实用小工具   ·   697 人在线   最高记录 3762   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 162ms · UTC 20:00 · PVG 04:00 · LAX 13:00 · JFK 16:00
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1