简单的与OOP相关的问题

时间:2010-05-10 11:45:47

标签: c++ oop class

这个问题在我脑海里浮现了很多次。

让我通过一个例子解释我的问题。

说我有两节课: 1-网格。 2-细胞。

现在,单元格的位置'应该'存储在网格类中,而不是存储在单元类本身中。假设单元格想要通过网格中的方法获取其位置。

怎么做呢?请记住,单元格是由Grid类创建/初始化的。

解决这个问题有什么好的OO方法?

谢谢

13 个答案:

答案 0 :(得分:9)

我认为这不是一个好的设计。如果单元需要知道它的位置,它应该自己保存它并为网格提供访问它的方法。

答案 1 :(得分:4)

我会用以下方式看待它:

  • “网格”只是“Cell”的集合
  • 每个“单元格”在“网格”中的位置都是数据成员
  • 每个“单元格”可能包含一个“数据”对象,其中包含“单元格”的实际用户内容

这样,您可以将“单元格”视为网格中的坐标。

答案 2 :(得分:2)

为什么细胞需要知道它在网格中的位置?好像小区应该不知道它所在的位置。 如果你仍然需要这个 - 单元格可以保存指向其封闭网格的指针,它可以询问它的位置(就像这样,在单元格类中:getGrid()。getLocation(this))

答案 3 :(得分:1)

最好的方法是向网格询问特定小区的位置。

另一个解决方案是在单元格的构造函数中为单元格指定网格。当请求单元格的位置时,它可以从网格的函数返回位置。

答案 4 :(得分:1)

如果你想让细胞知道它的位置,那就把它放在细胞内。没有必要将它保持在课堂之外,不是单个单元格可以用在不同的网格中(因为你已经想要获得它的位置并且存在这样的限制)。

或者,如果需要知道位置的单元格方法是从网格调用的,那么我只是将位置作为参数传递给该方法。

在一些非常特殊的情况下,您可以在单元格中存储对网格的引用,或者将其作为参数传递给它的方法,但它只是感觉不对,引入了过多的耦合。

答案 5 :(得分:1)

这很简单,只需让Cell的构造函数占用它的位置,假设这是构造函数:

public:
    Cell(/*assume this is a generic type*/T value, int i, int j)
    {
    }

你为什么这样做?首先,因为在您创建一个单元格之后它的位置几乎是固定的,除非您将执行像'insert'这样的专门操作。我不建议在Grid上调用方法,或在本地保留Grid实例。

答案 6 :(得分:1)

对我来说,单元格似乎不需要知道它在Grid中的位置。重要的是,不是Cell从Grid获取其位置,但Grid在需要时为该单元提供位置!因此,Grid会调用Cell的方法来执行此操作。不是相反。

最合乎逻辑的是Grid包含许多单元格,因此它“拥有”它们(例如创建单元格,移动它们或其他任何单元格)。因此,Cell不应该对Grid有任何了解。

细胞本身包含一些信息。此信息可能需要刷新或其他内容,具体取决于网格中的位置。然后你可以在Cell中有一个方法,由Grid调用来执行此操作。如果需要,该方法可以接受位置参数,但是单元本身不会将它们作为成员保留。

答案 7 :(得分:1)

正如尼尔所说,如果细胞需要知道它的位置,它应该存储它。

话虽这么说,我不认为细胞应该知道它的位置。网格负责管理单元格,包括它们的位置,告诉它们在哪里绘制自己等等。单元格应该负责单元格包含的内容 - 例如,数据,格式化信息等。

因此,单元格永远不需要知道它在网格中的位置。它可能需要做一些事情,比如绘制自己,但这应该根据网格传递的屏幕坐标来完成。网格应该控制哪些细胞被涂上了?哪里。细胞应该做他们被告知的事情&其中。

答案 8 :(得分:0)

网格可以通过一些函数搜索一个单元格,该函数可以通过缓存或者单元格的字典/映射到整数的n元组来优化。

答案 9 :(得分:0)

我会考虑在每个单元格对象中存储位置,网格对象应该包含一组单元格,即创建的数量。这样我就可以解决一些我将面临的问题。

答案 10 :(得分:0)

如果是grid的责任,那么您必须让cell知道它属于grid。将其添加到单元格的构造函数中。

这里唯一需要考虑的问题是,知道位置的确是谁的责任。

答案 11 :(得分:0)

我猜你所说的是网格中的单元格位置并非其“Cell - ness”固有的,可以这么说,你想拥有Cell的概念独立于Grid,因此单元格对象不应具有任何特定于网格的信息。

我不确定区别是多么有价值,但如果你想要它,有几个选择:

  • Cell作为基类,并从中派生GridCellGridCell包含指向包含Grid对象的后向指针或其位置,正如其他答案所示。
  • 使用the Decorator pattern之类的内容在运行时向Cell对象添加特定于网格的信息和接口。

再次,它闻起来我们正在努力使它变得更难 - 我不确定Cell是不是Grid的一部分而且我不喜欢看到让Cell个物体保持其在网格中的位置的危害。事实上,让我感到更简单的是让Grid对象维护一个简单的Cell个对象集合,每个对象都有责任知道它们在Grid中的位置。

答案 12 :(得分:0)

工厂方法设计模式

定义用于创建对象的接口,但是让您的子类决定实例化哪个类。 Factory方法定义了一个用于创建对象的接口,但是让子类决定要实例化哪些类。