【发布时间】:2019-01-04 21:23:19
【问题描述】:
我正在阅读一篇关于composition vs inheritance 的文章,该文章使用了术语“域类”和“实现类”。作者特别说“域类应该使用实现类,而不是从它们继承”。请解释一下领域类和实现类的区别。
【问题讨论】:
标签: class oop inheritance composition
我正在阅读一篇关于composition vs inheritance 的文章,该文章使用了术语“域类”和“实现类”。作者特别说“域类应该使用实现类,而不是从它们继承”。请解释一下领域类和实现类的区别。
【问题讨论】:
标签: class oop inheritance composition
文中给出的一个实现类的例子是ArrayList。它不是描述业务实体的代码的一部分,它只是一个常用的通用类。
这与他们提到的 Customer 类形成对比。 Customer 将是属于域的一个类,它描述的是特定于业务的实体。
这篇文章告诉您在创建域类时不要像这样从实用程序类进行扩展。
如何滥用继承 - 示例 2
通过从实现类继承来创建域概念类是一种常见的继承误用。例如,假设我们想对我们的特定客户群做某事。简单明了的做法是继承 ArrayList,将其命名为 CustomerGroup,然后开始编码,对吗?
错了。那将是跨域继承关系,应该避免:
1) ArrayList 已经是 list 的子类,一个实用程序集合 - 一个实现类。
2) CustomerGroup 是另一个子类 - 域类。
3) 域类应该使用实现类,而不是从它们继承。
如果您需要实现 CustomerGroup 类,它可以将 ArrayList 作为实例成员,如下所示:
public class CustomerGroup {
private List<Customer> customers = new ArrayList<>();
public List<Customer> getCustomers() {return customers;}
}
但你不会让类本身成为 ArrayList 的子类。
原因是当您将某些东西子类化时,即使不合适,您的类的用户也会获得超类的所有功能。您实际上不需要域类来查看它的实际效果,只需查看 java.util.Properties 的源代码,它的设计很糟糕,扩展了 java.util.Hashtable。当您使用 Properties 对象时,您可以使用 Hashtable 中的方法,即使它们完全不必要且令人困惑,并且使用超类方法不起作用或会导致问题。
【讨论】: