在获得界面时防止暴露在课堂上

时间:2016-10-28 06:58:43

标签: c++ interface

我做了一个示例,如下图所示,类似于我正在处理的真实项目。我正在用C ++实现这个项目。

这个例子的要点是我有一个FruitGarden我知道它总是包含一个AppleTree。在FruitGarden的函数StartHarvesting中,应检查AppleTree是否已准备好进行收获。为此,我创建了一个接口类。

我现在使用该接口的方式是在GetTreePointer中实现一个函数Vegitation并将其转换为IFoodTree(并检查NULL)。我在这里看到的问题是我将我的完整树暴露给外界(通过实现GetTreePointer),启用其他公共函数的调用,这些函数不打算在Vegitation之外使用。

我的主要问题是:获取指向IFoodTree的界面AppleTree的最佳方法是什么?

UML diagram

2 个答案:

答案 0 :(得分:0)

也许您不应该在GetTreePointer()中提供VegitationGarden可以在Vegitation中使用bool canHarvest()来检查是否可以收获。

为了获得苹果,在vector<Apple> harvest()中,Tree有助于检查是否是收获苹果的正确时间,Vegitation可以获得结果。通过这样做,它不会在Vegitation之外暴露Garden

另一种实现方法是将self.bill += int(self.menu[food]) self.bill = self.bill * quantity 作为self.bill = 50 # (BBQ Grill) self.bill = 50 * 4 # (4 x BBQ Grill) self.bill = 200 的内部受保护类。

答案 1 :(得分:0)

这里有很多选择。最简单的可能是printf

另一个简单的方法是保留私有函数virtual bool Vegetations::ReadyForHarvest() const { return false; }。如果private只能从AppleTree::Foo调用Vegetation,则Vegetation应定义private: virtual void Foo() = 0;。很明显Vegetation不应该知道派生类,这会颠倒继承的方向,而且太脆弱了。相反,派生类必须实现基类所需的纯虚函数。编译器会帮助您解决此问题。