首页 > 解决方案 > 领域类与实现类

问题描述

我正在阅读一篇关于组合与继承的文章,文章使用了术语“域类”和“实现类”。作者特别说“域类应该使用实现类,而不是从它们继承”。请解释域类和实现类之间的区别。

标签: classoopinheritancecomposition

解决方案


文章中给出的一个实现类的例子是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 中的方法,即使它们完全不必要且令人困惑,并且使用超类方法不起作用或会导致问题。


推荐阅读