领域类与实现类

Ada*_*rry 5 oop inheritance class composition

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

Nat*_*hes 6

文章中给出的一个实现类的例子是ArrayList。它不是描述业务实体的代码的一部分,它只是一个常用的通用类。

这与他们提到的 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;}
} 
Run Code Online (Sandbox Code Playgroud)

但是您不会使类本身成为 ArrayList 的子类。

原因是当你对某些东西进行子类化时,你的类的用户可以获得超类的所有功能,即使它不合适。您实际上并不需要域类来查看此操作,只需查看 java.util.Properties 的源代码,它的设计很糟糕,扩展了 java.util.Hashtable。当您使用 Properties 对象时,您可以使用 Hashtable 中的方法,即使它们完全没有必要且令人困惑,并且使用超类方法不起作用或导致问题。