Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class 域类与实现类_Class_Oop_Inheritance_Composition - Fatal编程技术网

Class 域类与实现类

Class 域类与实现类,class,oop,inheritance,composition,Class,Oop,Inheritance,Composition,我在读一篇关于的文章,文章使用了术语“域类”和“实现类”。作者特别指出“域类应该使用实现类,而不是从它们继承”。请解释域类和实现类之间的区别。本文中给出的实现类示例是ArrayList。它不是描述业务实体的代码的一部分,它只是一个常用的通用类 这与他们提到的客户类别形成对比。Customer将是域的一部分,在域中它描述特定于业务的实体 本文告诉您在创建域类时不要像这样扩展实用程序类 如何滥用继承-示例2 通过从实现类继承来创建域概念类是继承的常见误用。例如,假设我们想和某一部分客户做点什么。简单

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

本文中给出的实现类示例是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;}
} 
公共类CustomerGroup{
private List customers=new ArrayList();
public List getCustomers(){return customers;}
} 
但是您不能使类本身成为ArrayList的子类


原因是,当您对某个对象进行子类化时,您的类的用户将获得超类的所有功能,即使它不合适。实际上,您不需要域类来查看这一点,只需查看java.util.Properties的源代码,它的设计很糟糕,扩展了java.util.Hashtable。当您使用Properties对象时,Hashtable中的方法对您是可用的,即使它们完全不必要且容易混淆,并且使用超类方法不起作用或会导致问题。

那么是否存在将ArrayList类视为域类的上下文?就像每一门课都是一门还是另一门,而且这门课永远不会根据上下文而改变?@亚当:不太可能。这是关于实现问题与接口的关系。实际上,您甚至不需要考虑业务域实体。查看java.util.Properties,了解文章所批评的错误设计决策。