6

我正在编写一个简单的游戏来学习获得更多的 C++ 经验,并且我知道我觉得多态性几乎可以工作,但没有。在这个游戏中,Party通过 a 的移动相当线性Map,但偶尔会Fork在路上遇到 a。叉子(基本上)是一个std::vector<location*>.Original 我打算在Party成员函数中编写如下代码:

if(!CurrLocation->fork_.empty())
   // Loop through forks and show options to the player, go where s/he wants
else
  (CurrLocation++)

但我想知道以下的一些变体是否会更好:

CurrLocation = CurrLocation->getNext();

Fork 实际上是从 Location 派生的,并重载了一些新功能getNext()。但是在后一种情况下,location(一个低级结构)必须是向用户呈现消息而不是“传递这个备份”的那个,我不觉得它是优雅的,因为它locationUserInterface::*.

你的意见?

4

4 回答 4

6

所有问题都可以通过添加一个间接级别来解决。我会使用您建议的变体,并通过允许 getNext 接受解析方向选择的对象来将 Location 与 Party 分离。这是一个示例(未经测试):

class Location; 

class IDirectionChooser
{
public:
  virtual bool ShouldIGoThisWay(Location & way) = 0;
};

class Location
{
public:
  virtual Location * GetNext(IDirectionChooser & chooser)
  {
    return nextLocation;
  }

  virtual Describe();
private:
  Location * nextLocation;
};

class Fork : public Location
{
public:
  virtual Location * GetNext(IDirectionChooser & chooser)
  {
    for (int i = 0; i < locations.size(); i++)
      if (chooser.ShouldIGoThisWay(*locations[i]))
        return locations[i];
  }
  virtual Describe();
private:
  vector<Location *> locations;
};

class Party : public IDirectionChooser
{
public:
  void Move()
  {
    currentLocation = currentLocation->GetNext(GetDirectionChooser());
  }

  virtual IDirectionChooser & GetDirectionChooser() { return *this; }

  virtual bool ShouldIGoThisWay(Location & way)
  {
    way.Describe();
    cout << "Do you want to go that way? y/n" << endl;

    char ans;
    cin >> ans;
    return ans == 'y';
  }
};
于 2009-01-09T00:12:30.180 回答
1

您应该使用多态性,只要它有意义并简化您的设计。你不应该仅仅因为它存在并且有一个花哨的名字就使用它。如果它确实使您的设计更简单,那么值得耦合。

正确性和简单性应该是每个设计决策的最终目标。

于 2009-01-08T22:01:26.620 回答
1

我认为您自己发现了问题,并且可能可以通过您对系统其余部分的了解或此处提供的更多详细信息来解决问题,以供我们查看。

如前所述:

  1. 应该使用多态性来简化设计——在这种情况下它会这样做,所以很明显。
  2. 您的耦合有问题 - 再次发现,耦合可能会导致以后出现问题。然而,这对我来说是你应用多态性的方式可能不是最好的方式。
  3. 对接口进行编程应该允许您隐藏系统如何组合在一起的内部细节,从而减少耦合。
于 2009-01-08T22:10:41.110 回答
0

多态性不会带来更大的耦合,我认为它们是独立的问题。

事实上,如果您正在对接口进行编程并遵循控制模式的一般反转,那么您将导致更少或零耦合。

在您的示例中,我看不到位置如何与 UserInterface 耦合?

如果是这种情况,是否可以通过 UserInterface 和 Location 之间的另一个抽象级别(例如 LocationViewAdapter)来消除耦合?

于 2009-01-08T22:01:48.897 回答