Java 我应该在层次结构之外创建一个对象,还是传递参数在内部创建它?
我找不到类似的问题,所以我自己问。如果这是一个重复的问题,我很抱歉。 (另外,尽管我用Java标记了这个问题,但它更像是一个一般的OOP问题) 假设我有这样一个类层次结构:一个名为“RestaurantManager”的经理类,它有“Restaurants”和“displays” 创建餐厅或菜肴时,我应该在RestaurantManager之外创建它们,还是将参数传递给经理,以便经理可以实例化其中的对象 换句话说,我应该这样做:Java 我应该在层次结构之外创建一个对象,还是传递参数在内部创建它?,java,oop,hierarchy,Java,Oop,Hierarchy,我找不到类似的问题,所以我自己问。如果这是一个重复的问题,我很抱歉。 (另外,尽管我用Java标记了这个问题,但它更像是一个一般的OOP问题) 假设我有这样一个类层次结构:一个名为“RestaurantManager”的经理类,它有“Restaurants”和“displays” 创建餐厅或菜肴时,我应该在RestaurantManager之外创建它们,还是将参数传递给经理,以便经理可以实例化其中的对象 换句话说,我应该这样做: RestaurantManager manager; manage
RestaurantManager manager;
manager.addRestaurant(new Restaurant(name));
或者这个:
RestaurantManager manager;
manager.addRestaurant(name);
如果餐厅经理有餐厅或菜肴的内部标识符,该怎么办
这更像是一个好的实践问题,但什么是最佳选择?没有通用的“最佳”选择-两种方法都有其优缺点
第一种方法允许通过附加子类化来扩展层次结构(例如,您可以定义class Diner extends Restaurant
和classFastFoodPlace extends Restaurant
,并将它们传递给您的RestaurantManager
。您还可以更改RestaurantManager
的构造函数的签名,而不会对RestaurantManager
的方法产生影响
第二种方法是让RestaurantManager
对调用方“拥有”餐厅的实现,将其隐藏在某些接口后面的外部视图中。除此之外,它还让RestaurantManager
决定餐厅是否有键,何时以及如何设置键,等等
您可以根据需要选择一种或另一种方法。第一种方法在RestaurantManager
之外提供了更大的灵活性,而第二种方法在RestaurantManager
内部提供了更好的封装。管理者和层次结构之间的耦合变得更紧密,这使得扩展层次结构更加困难.我认为您的第一个示例对OOP更有意义,因为它实际上将餐厅传递给addRestaurant。此外,它让类的用户能够更好地控制类层次结构中的对象。它还允许用户将餐厅的任何子类传递给构造函数
对于我来说,第二个唯一可用的场景是,出于某种原因,您希望隐藏经理使用的类
我不能说这两者中有哪一个比另一个更好,但我认为第一个更常见。谢谢,我认为你的解释是目前为止最好的。