我做了一个示例,如下图所示,类似于我正在处理的真实项目。我正在用C ++实现这个项目。
这个例子的要点是我有一个FruitGarden
我知道它总是包含一个AppleTree
。在FruitGarden
的函数StartHarvesting
中,应检查AppleTree
是否已准备好进行收获。为此,我创建了一个接口类。
我现在使用该接口的方式是在GetTreePointer
中实现一个函数Vegitation
并将其转换为IFoodTree
(并检查NULL)。我在这里看到的问题是我将我的完整树暴露给外界(通过实现GetTreePointer
),启用其他公共函数的调用,这些函数不打算在Vegitation
之外使用。
我的主要问题是:获取指向IFoodTree
的界面AppleTree
的最佳方法是什么?
答案 0 :(得分:0)
也许您不应该在GetTreePointer()
中提供Vegitation
,Garden
可以在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
不应该知道派生类,这会颠倒继承的方向,而且太脆弱了。相反,派生类必须实现基类所需的纯虚函数。编译器会帮助您解决此问题。