我应该扩展一个ArrayList(is-a)还是应该将它作为成员包含(has-a)?

red*_*ber 6 java inheritance composition

我正在制作一个维护数字列表的简单程序,我希望这个列表也有一个名字.哪种方法最好:让我的列表类扩展ArrayList还是让它包含一个ArrayList成员?在这两种情况下,当然都会有一个"名称"字符串成员.

第一种方法意味着我只需要为名称实现getter和setter,但我认为这会使我的类与特定实现过于紧密联系?例如,如果我想稍后使用Vector,那么我必须在任何地方更改代码.

第二种方法可以更容易地改变实现,但当然现在变得非常烦人,因为我必须实现一堆包装器.

我已经阅读了关于继承与组合的SO帖子,因为我的列表是一种ArrayList,所以我倾向于第一种方法.但是,讨论是否存在任何差异,因为我正在扩展Collection类vs扩展通用类?还是我过度思考这个?

Abi*_*usX 2

两者都不是更好,正如您提到的,这是一种权衡。

如果您进行聚合(has-a),您必须包装您将要使用的成员的所有功能(即实现调用它们的函数)

如果你进行继承,很多函数会被添加到你的新类中,这可能是不必要的,而且你还需要实现抽象函数。

如果你在 C++ 环境中,私有继承是一个选择,但是两者都有优点和缺点