我正在阅读一篇有关composition vs inheritance的文章,该文章使用了术语“域类”和“实现类”。作者专门说“域类应该使用实现类,而不是从它们继承”。请说明域类和实现类之间的区别。
答案 0 :(得分:3)
本文中给出的实现类的示例是ArrayList。它不是描述业务实体的代码的一部分,它只是常用的通用类。
这与他们提到的Customer类形成对比。客户将是域的一部分,它描述了特定于企业的实体。
本文告诉您在创建域类时不要从这样的实用程序类扩展。
如何滥用继承-示例2
通过从实现类继承来创建域概念类是常见的继承滥用。例如,假设我们想对特定客户群做某事。容易且显而易见的事情是将ArrayList子类化,将其命名为CustomerGroup,然后开始编码,对吧?
错了。那将是一个跨域的继承关系,应该避免这种情况:
1)ArrayList已经是列表的子类,它是一个实用程序集合-一个实现类。
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中的方法,并且使用超类方法不起作用或导致问题。