【问题标题】:What are the options or best practice in how to specialize a class ?如何专业化一门课程有哪些选择或最佳实践?
【发布时间】:2011-09-15 14:05:11
【问题描述】:

我已经创建了一个具有各自属性的 Person 类;最终一个人可以变成员工。

使用继承,Employee 可以是 Person 的子类。如何在不需要将其所有属性转移到新的 Employee 类的情况下将这个 Person 转换(“专门化”)为一个 Employee ?

拥有一个具有 Person 类型属性的独立(关于继承)Employee 类是否更好(如在 DB 中经常看到的那样)?

提前致谢!

【问题讨论】:

  • @downvoter,请帮助 OP 改进他的问题,而不是默默地反对并投票结束。
  • 我不太明白这个问题——你的意思是你最终想从Person 创建一个Employee 的实例吗?你可能想要Employee.fromPerson(person) 或类似的东西。

标签: java oop inheritance composition


【解决方案1】:

这在 Java 中是不可能的。一个对象有一个类型,并且不能获取一个新的类型。如果它是一个人,它将永远是一个人,永远不会是一个雇员。不过,您可以从 Person 创建一个 Employee 类型的新对象:

public class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    /**
     * copy constructor
     */
    protected Person(Person p) {
        this.name = p.name;
    }

    // ...
}

public class Employee extends Person {
    private String badge;

    public Employee(Person p, String badge) {
        super(p);
        this.badge = badge;
    }

    // ...
}

【讨论】:

    【解决方案2】:

    据我了解,问题是继承(is-A)还是组合(has-A)?

    一般来说,这些通常是替代品。并且保持一般性,继承破坏了封装,因此它不应该被过度使用/误用,但 Java 根本不支持语言组合。

    具体来说 - Employee 始终是 Person,因此 将其作为子类是正确的方法。它可以建模为组合,Person 实例是 Employee 类的一个属性,但说“Employee has Person”(属性)听起来很奇怪,所以除非我有其他解决方案的原因,否则我会避免它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多