【问题标题】:Subclass instance to Superclass子类实例到超类
【发布时间】:2014-11-25 19:10:02
【问题描述】:

如何基于超类对象创建子类对象?

例如:

class Super {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


class Sub extends Super {
    private String lastName;

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}


public class Test {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Super sup = new Super();
        sup.setId(1);
        sup.setName("Super");

        Sub sub = new Sub();

        System.out.println(sub.getName());
    }

}

如何创建具有之前创建的“超级”属性的“子”对象?

或者我应该手动传递属性,例如:

sub.setName(sup.getName());
sub.setId(sup.getId());

【问题讨论】:

  • 您的用例是什么?为什么需要它?
  • @nrainer 我有 FirmwareVersionSoftwareVersion 扩展 Version 的类。用户可以将一个或多个版本添加到列表中。所以,我打电话给new Version()。当用户单击“保存”按钮时,他必须选择它是固件版本还是软件版本。然后我可以打电话给new FirmwareVersion()new SoftwareVersion()
  • 好的。然后我假设不可能避免创建Version 的实例,是吗?我们是在谈论 Web 应用程序吗?
  • 是的,那时我不知道它会是什么类型的版本。所以,我必须创建一个通用版本。只有稍后,当用户选择时,我才能创建特定版本。这是一个桌面应用程序。第一次我创建了一个抽象版本,但显然,它必须是一个具体的类。有接口方法的解决方案吗?
  • 为什么需要创建通用版?不能等到用户选择版本吗?

标签: java inheritance


【解决方案1】:

您可以向Super Class 添加一个复制构造函数

public class Super {
    private int id;
    private String name;

    public Super(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public Super(Super other) {
        this.id = other.id;
        this.name = other.name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

然后在子类中使用这个构造函数

class Sub extends Super {
    public Sub(Super other) {
        super(other);
    }

    private String lastName;

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

你可以打电话

Sub sub = new Sub(sup);

【讨论】:

    【解决方案2】:

    我会在 Sub 中创建一个静态方法:

    Sub.fromSuper(Super s, String last)
    

    【讨论】:

      【解决方案3】:

      我会使用 apache commons

      BeanUtils.copyProperties(toBean, fromBean);
      

      除非每个对象都确实需要它,否则我不会向类本身添加方法。 BeanUtils 似乎很合适,因为它看起来像是仅在特定情况下才需要的东西。

      如果您真的需要每个对象的行为,那么实现copy constructor 是一种方法

      【讨论】:

        猜你喜欢
        • 2021-10-10
        • 2015-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多