Class 域类与实现类
我在读一篇关于的文章,文章使用了术语“域类”和“实现类”。作者特别指出“域类应该使用实现类,而不是从它们继承”。请解释域类和实现类之间的区别。本文中给出的实现类示例是ArrayList。它不是描述业务实体的代码的一部分,它只是一个常用的通用类 这与他们提到的客户类别形成对比。Customer将是域的一部分,在域中它描述特定于业务的实体 本文告诉您在创建域类时不要像这样扩展实用程序类 如何滥用继承-示例2 通过从实现类继承来创建域概念类是继承的常见误用。例如,假设我们想和某一部分客户做点什么。简单而明显的做法是将ArrayList子类化,称之为CustomerGroup,然后开始编码,对吗 错。这将是一种跨域继承关系,应该避免: 1) ArrayList已经是list的一个子类了,它是一个实用程序集合,是一个实现类 2) CustomerGroup是另一个子类—域类 3) 域类应该使用实现类,而不是从它们继承 如果需要实现CustomerGroup类,则可以将ArrayList作为实例成员,如下所示:Class 域类与实现类,class,oop,inheritance,composition,Class,Oop,Inheritance,Composition,我在读一篇关于的文章,文章使用了术语“域类”和“实现类”。作者特别指出“域类应该使用实现类,而不是从它们继承”。请解释域类和实现类之间的区别。本文中给出的实现类示例是ArrayList。它不是描述业务实体的代码的一部分,它只是一个常用的通用类 这与他们提到的客户类别形成对比。Customer将是域的一部分,在域中它描述特定于业务的实体 本文告诉您在创建域类时不要像这样扩展实用程序类 如何滥用继承-示例2 通过从实现类继承来创建域概念类是继承的常见误用。例如,假设我们想和某一部分客户做点什么。简单
public class CustomerGroup {
private List<Customer> customers = new ArrayList<>();
public List<Customer> getCustomers() {return customers;}
}
公共类CustomerGroup{
private List customers=new ArrayList();
public List getCustomers(){return customers;}
}
但是您不能使类本身成为ArrayList的子类
原因是,当您对某个对象进行子类化时,您的类的用户将获得超类的所有功能,即使它不合适。实际上,您不需要域类来查看这一点,只需查看java.util.Properties的源代码,它的设计很糟糕,扩展了java.util.Hashtable。当您使用Properties对象时,Hashtable中的方法对您是可用的,即使它们完全不必要且容易混淆,并且使用超类方法不起作用或会导致问题。那么是否存在将ArrayList类视为域类的上下文?就像每一门课都是一门还是另一门,而且这门课永远不会根据上下文而改变?@亚当:不太可能。这是关于实现问题与接口的关系。实际上,您甚至不需要考虑业务域实体。查看java.util.Properties,了解文章所批评的错误设计决策。