通过一个例子来解释我的问题。
假设我有两个类: 1- 网格。 2- 单元格。
现在单元格的位置“应该”存储在网格类中,而不是单元格类本身。假设单元格想要通过网格中的一个方法获取它的位置。
那么它该如何做呢?请记住,单元格是由网格类创建/初始化的。
什么样的良好的面向对象方法可以解决这个问题?
谢谢
我认为这不是一个好的设计。如果单元格需要知道它的位置,它应该自己保存并提供方法供网格访问。
我会这样看待它:
这样,您可以将"Cell"视为网格中的坐标。
public:
Cell(/*assume this is a generic type*/T value, int i, int j)
{
}
为什么要这样做?首先,因为创建单元格后,其位置基本上是固定的,除非您进行专门的操作,如“插入”。我不建议在网格上调用方法,或在本地保留网格实例。
最好的方法是向网格询问特定单元格的位置。
另一种解决方案是在单元格的构造函数中为其提供指向网格的指针。当请求单元格的位置时,它可以从网格的函数返回位置。
如果您想让单元格知道它的位置,那么只需将其放在单元格内部即可。将其保留在类外部没有意义,因为单个单元格无法在不同的网格中使用(因为您已经想要获取它的位置并且这会限制它的使用)。
或者,如果需要知道位置的单元格方法是从网格中调用的,则可以将位置作为参数传递给该方法。
在某些非常特殊的情况下,您可能会在单元格中存储对网格的引用或将其作为参数传递给其方法,但这感觉不太对,会引入过多的耦合。
对于我来说,单元格不需要知道它在网格中的位置似乎并不必要。重要的是,不是单元格从网格获得其位置,而是当需要时网格将位置提供给单元格!因此,网格调用单元格的某个方法来执行此操作。而不是反过来。
最合理的做法是,网格包含许多单元格,因此它“拥有”它们(例如创建单元格,移动它们或其他操作)。因此,单元格不应该知道网格的任何信息。
单元格本身包含一些信息。这些信息可能需要根据网格中的位置进行刷新或进行其他处理。那么,您可以在单元格中拥有一个方法,由网格调用来执行此操作。如果需要,该方法可能会接受位置参数,但单元格本身不将其视为成员。
正如Neil所建议的那样,如果单元格需要知道它的位置,它应该将其存储。
话虽如此,我认为单元格不应该需要知道它的位置。网格负责管理单元格,包括它们的位置,告诉它们在哪里绘制等等。单元格应该负责包含什么单元格--例如,数据、格式信息等等。
因此,单元格永远不应该需要知道它在网格中的位置。它可能需要做一些像绘制自己这样的事情,但这应该是通过网格传递的屏幕坐标来完成的。网格应该控制哪些单元格被绘制以及在哪里绘制。单元格应该只做它们被告知要做的事情和位置。
网格可以使用某些函数在自身中搜索单元格,该函数可以通过具有缓存或单元格到整数n元组的字典/映射来进行优化。
我认为可以将每个单元格对象的位置存储起来,并且网格对象应该包含一个已创建的单元格集合的数量。这样,我将解决一些可能遇到的问题。