“是一个”,“有一个”关系设计决定

时间:2013-06-02 14:06:55

标签: c# design-patterns

我有一块电路板,电路板上有移动的瓷砖。 非常简单,我的模型将有一个Board类和一个Tile类什么是POCO和Board“has”tile(Board有一个IList< Tile>)

我有一个UI(Unity3d行为)说BoardBehaviour“有一个”董事会。但这里开始我的问题。我还有TileBehaviour UI对象“有一个”平铺。这似乎是多余的,因为:

  • BoardBehaviour有一个有Tiles的董事会。
  • BoardBehaviour有TileBehaviours(IList< TileBehaviours>),每个TileBehavious都有一个Tile。

我有点困惑......

如何连接模型和实际UI类的任何想法?

4 个答案:

答案 0 :(得分:1)

是一种关系:当你从基类继承时,派生类是一个基类;即汽车是一种车辆;

有一种关系:当你说班级有某种东西(组成)时,即汽车有引擎。 发动机是汽车的一部分。

所以在这里移动Tile是董事会的一部分。所以董事会“有一个”平铺。

当您实现行为(Inherit property)时,它的“是一个”关系。没有冗余。

 BoardBehaviour "has a" Board.

董事会有董事会行为。

Board class实现BoardBehaviour。 Tile类实现了TileBehaviour。 Board类在Tile中的内部类(或者你可以在Board中创建新的Tile对象,如果需要Tile作为单独的类)。

答案 1 :(得分:1)

BoardBehaviour和TileBehaviour可能是坏课程。让我们分析一下现状。 BoardBehaviour有董事会成员。这很奇怪。事实上,董事会应该有行为。这就是为什么我可以建议创建基类BehaviourItem,它将具有所有行为功能。 Board和Tile应该从BehaviourItem继承。这应该解决一些复杂性问题。

答案 2 :(得分:0)

有一个

董事会有瓷砖。 BoardBehavior有TileBehaviors

这是一个理论构造函数:

BoardBehavior(Board board, ...)
{
    this.m_tileBehavoirs = board.Tiles
        .Select(tile => new TileBehavior(tile, ...)).ToList();
}

答案 3 :(得分:0)

我建议这样的事情:你应该有两个接口1. BoardBehavior 2. TilesBehavior。分别在Class Board和Tiles中实现它们。现在,董事会应该有瓷砖清单。这个问题可以通过关联或组合来解决。我建议你应该联想。这意味着在您的Board类中,我们可以引用仅实现TilesBehavior的Tile List。我希望我在这里听起来不太复杂。如果我是,请告诉我,我将提供这种方法的代码,以使其更清晰。