【问题标题】:Prevent exposure to class while getting an interface在获取接口时防止暴露于类
【发布时间】:2016-10-28 06:58:43
【问题描述】:

我将下图中显示的示例模拟了我正在从事的实际项目。我正在用 C++ 实现这个项目。

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

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

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

【问题讨论】:

  • 经过编辑使其更具可读性,但由于我无法更新 UML,因此我留下了“Vegitation”(=> Vegetation)。

标签: c++ interface


【解决方案1】:

也许你不应该在Vegitation中提供GetTreePointer(),可以在Garden中使用它来检查是否可以收获。

为了得到苹果,在Vegitationbool canHarvest()帮助检查是否是收获苹果的正确时间,vector<Apple> harvest()帮助检查水果。通过这样做,它不会将Tree 暴露在 Vegitation 之外。

实现此目的的另一种方法是将Vegitation 作为Garden 的内部保护类。

【讨论】:

    【解决方案2】:

    这里有很多选择。最简单的可能是virtual bool Vegetations::ReadyForHarvest() const { return false; }

    另一个简单的方法是保留私有函数private。如果AppleTree::Foo 只打算从Vegetation 调用,则Vegetation 应该定义private: virtual void Foo() = 0;。很明显Vegetation 不应该知道派生类,这是颠倒继承的方向并且太脆弱了。相反,派生类必须实现基类所要求的,就纯虚函数而言。编译器可以帮助您。

    【讨论】:

      猜你喜欢
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-14
      相关资源
      最近更新 更多