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