域类与实现类

时间:2019-01-04 21:23:19

标签: class oop inheritance composition

我正在阅读一篇有关composition vs inheritance的文章,该文章使用了术语“域类”和“实现类”。作者专门说“域类应该使用实现类,而不是从它们继承”。请说明域类和实现类之间的区别。

1 个答案:

答案 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中的方法,并且使用超类方法不起作用或导致问题。