代码之家  ›  专栏  ›  技术社区  ›  m4design

与OOP相关的简单问题

  •  4
  • m4design  · 技术社区  · 15 年前

    这个问题我想了好几次。

    让我用一个例子来解释我的问题。

    假设我有两个班: 1格。 2细胞。

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

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

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

    谢谢你

    13 回复  |  直到 15 年前
        1
  •  9
  •   anon    15 年前

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

        2
  •  4
  •   Joris Timmermans    15 年前

    我会用以下方式来看待它:

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

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

        3
  •  2
  •   duduamar    15 年前

    为什么单元格需要知道其在网格中的位置?似乎手机不应该知道它的位置。 如果您仍然需要这个-单元格可以保存指向其封闭网格的指针,并且可以向它请求位置(如,在单元格类:getgrid().getlocation(this))。

        4
  •  1
  •   Indrek    15 年前

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

    另一种解决方案是给单元格一个指向其构造函数中网格的指针。当单元格被请求定位时,它可以从网格函数返回定位。

        5
  •  1
  •   vava    15 年前

    如果你想让手机知道它的位置,就把它放进手机里。没有必要把它放在类之外,也没有必要在不同的网格中使用单个单元格(因为您已经想得到它的位置,这就设置了这样的限制)。

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

    在一些非常特殊的情况下,您可能会将对网格的引用存储在一个单元中,或者将其作为参数传递给它的方法,但在引入太多耦合时,您会觉得这是错误的。

        6
  •  1
  •   Ion Todirel    15 年前

    这很简单,只需让单元的构造函数获取其位置,假设这是构造函数:

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

    你为什么要这样做?首先,因为在创建一个单元格后,它的位置几乎是固定的,除非您要执行像“insert”这样的特殊操作。我不建议在网格上调用方法,也不建议在本地保留网格实例。

        7
  •  1
  •   m_pGladiator    15 年前

    对我来说,似乎没有必要让手机知道它在网格中的位置。重要的是,不是单元格从网格中获取其位置,而是网格在需要时将位置提供给单元格!所以网格调用单元格的一个方法来实现这一点。不是反过来。

    最合乎逻辑的是网格包含许多单元格,因此它“拥有”这些单元格(例如,创建单元格、移动单元格或其他)。因此,单元不应该知道关于网格的任何信息。

    单元格本身包含一些信息。根据网格中的位置,可能需要刷新此信息或其他信息。然后,您可以在单元格中有一个方法,由网格调用以执行此操作。如果需要,该方法可能接受位置参数,但单元本身不将它们作为成员保存。

        8
  •  1
  •   John Dibling    15 年前

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

    尽管如此,我认为手机不需要知道它的位置。网格负责管理单元格,包括它们的位置、告诉它们在哪里绘制自己等等。单元格应负责包含哪些单元格——例如,数据、格式信息等。

    因此,单元不需要知道它在网格中的位置。它可能需要做一些类似于绘制自己的事情,但这应该根据网格传递的屏幕坐标来完成。网格应控制绘制哪些单元格以及在何处绘制。细胞应该只做他们被告知的事情。

        9
  •  0
  •   Nick    15 年前

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

        10
  •  0
  •   Adrian Fâciu    15 年前

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

        11
  •  0
  •   bitc    15 年前

    如果是 grid 那么你就必须让 cell 知道什么 网格 它属于。将此添加到单元格的构造函数中。

    这里唯一需要你考虑的问题是谁的责任是知道地点。

        12
  •  0
  •   JohnMcG    15 年前

    我想你说的是,一个单元格在网格中的位置不是其固有的 Cell -也就是说,你想要一个 细胞 独立于 Grid ,因此cell对象不应具有任何特定于网格的信息。

    我不确定这一区别有多重要,但如果你愿意,有两种选择:

    • 制作 细胞 一个基类,并派生 GridCell 从它。 网格单元 包含指向包含的 网格 对象或其位置,如其他答案所示。
    • 使用类似的东西 the Decorator pattern 将特定于网格的信息和接口添加到 细胞 对象在运行时。

    再说一次,我们让这件事变得比现在更难——我不确定是否有必要 细胞 这不是 网格 我看不出 细胞 对象在网格中保持其位置。事实上,我觉得 网格 对象维护一个简单的 细胞 对象,每个对象负责知道它们在 网格 .

        13
  •  0
  •   Thalaivar    15 年前

    工厂方法设计模式

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