这个问题在我脑海里浮现了很多次。
让我通过一个例子解释我的问题。
说我有两节课: 1-网格。 2-细胞。
现在,单元格的位置'应该'存储在网格类中,而不是存储在单元类本身中。假设单元格想要通过网格中的方法获取其位置。
怎么做呢?请记住,单元格是由Grid类创建/初始化的。
解决这个问题有什么好的OO方法?
谢谢
答案 0 :(得分:9)
我认为这不是一个好的设计。如果单元需要知道它的位置,它应该自己保存它并为网格提供访问它的方法。
答案 1 :(得分:4)
我会用以下方式看待它:
这样,您可以将“单元格”视为网格中的坐标。
答案 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
作为基类,并从中派生GridCell
。 GridCell
包含指向包含Grid
对象的后向指针或其位置,正如其他答案所示。Decorator
pattern之类的内容在运行时向Cell
对象添加特定于网格的信息和接口。再次,它闻起来我们正在努力使它变得更难 - 我不确定Cell
是不是Grid
的一部分而且我不喜欢看到让Cell
个物体保持其在网格中的位置的危害。事实上,让我感到更简单的是让Grid
对象维护一个简单的Cell
个对象集合,每个对象都有责任知道它们在Grid
中的位置。
答案 12 :(得分:0)
工厂方法设计模式
定义用于创建对象的接口,但是让您的子类决定实例化哪个类。 Factory方法定义了一个用于创建对象的接口,但是让子类决定要实例化哪些类。