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
Java 我应该在层次结构之外创建一个对象,还是传递参数在内部创建它?_Java_Oop_Hierarchy - Fatal编程技术网

Java 我应该在层次结构之外创建一个对象,还是传递参数在内部创建它?

Java 我应该在层次结构之外创建一个对象,还是传递参数在内部创建它?,java,oop,hierarchy,Java,Oop,Hierarchy,我找不到类似的问题,所以我自己问。如果这是一个重复的问题,我很抱歉。 (另外,尽管我用Java标记了这个问题,但它更像是一个一般的OOP问题) 假设我有这样一个类层次结构:一个名为“RestaurantManager”的经理类,它有“Restaurants”和“displays” 创建餐厅或菜肴时,我应该在RestaurantManager之外创建它们,还是将参数传递给经理,以便经理可以实例化其中的对象 换句话说,我应该这样做: RestaurantManager manager; manage

我找不到类似的问题,所以我自己问。如果这是一个重复的问题,我很抱歉。 (另外,尽管我用Java标记了这个问题,但它更像是一个一般的OOP问题)

假设我有这样一个类层次结构:一个名为“RestaurantManager”的经理类,它有“Restaurants”和“displays”

创建餐厅或菜肴时,我应该在RestaurantManager之外创建它们,还是将参数传递给经理,以便经理可以实例化其中的对象

换句话说,我应该这样做:

RestaurantManager manager;
manager.addRestaurant(new Restaurant(name));
或者这个:

RestaurantManager manager;
manager.addRestaurant(name);
如果餐厅经理有餐厅或菜肴的内部标识符,该怎么办

这更像是一个好的实践问题,但什么是最佳选择?

没有通用的“最佳”选择-两种方法都有其优缺点

第一种方法允许通过附加子类化来扩展层次结构(例如,您可以定义
class Diner extends Restaurant
和class
FastFoodPlace extends Restaurant
,并将它们传递给您的
RestaurantManager
。您还可以更改
RestaurantManager
的构造函数的签名,而不会对
RestaurantManager
的方法产生影响

第二种方法是让
RestaurantManager
对调用方“拥有”餐厅
的实现,将其隐藏在某些接口后面的外部视图中。除此之外,它还让
RestaurantManager
决定餐厅是否有键,何时以及如何设置键,等等


您可以根据需要选择一种或另一种方法。第一种方法在
RestaurantManager
之外提供了更大的灵活性,而第二种方法在
RestaurantManager
内部提供了更好的封装。管理者和层次结构之间的耦合变得更紧密,这使得扩展层次结构更加困难.

我认为您的第一个示例对OOP更有意义,因为它实际上将餐厅传递给addRestaurant。此外,它让类的用户能够更好地控制类层次结构中的对象。它还允许用户将餐厅的任何子类传递给构造函数

对于我来说,第二个唯一可用的场景是,出于某种原因,您希望隐藏经理使用的类


我不能说这两者中有哪一个比另一个更好,但我认为第一个更常见。

谢谢,我认为你的解释是目前为止最好的。