一个类的属性是另一个类,反之亦然

时间:2014-04-11 11:20:02

标签: c# oop design-patterns

我正在使用C#编写棋盘游戏,其中两个最重要的类是PieceSquare。通常,Piece的每个实例都有Square(作为属性),Square的每个实例都可能有Piece(也可以作为属性)或者可能为空。< / p>

我将代码放在Square.PiecePiece.Square的set方法中,以确保维持这种关系(例如,当一个片段从一个方格移动到另一个方格时)并避免明显的危险链接属性在无限循环中调用彼此的set方法。

但是当从板上移除piece并将其square设置为'null'时,我似乎有太多的if语句来避免空异常,而且看起来很简单的模式在概念上变得很远在实践中过于复杂且容易出错。

我想知道我的整个方法是否错误。当piece还有square属性时,Square是否应将Piece作为属性?我实际上是否开始编写反模式? Piece的{​​{1}}在创建时可能为空,而Square的{​​{1}}通常为空(表示空)。我应该用另一种方式来表示不在板上的空方块和碎片吗?

我假设当一个类以双向关系链接到另一个类时,有一个更优选,更健全的解决方案。

非常感谢任何想法。

2 个答案:

答案 0 :(得分:2)

使用更高级别的抽象,使用

等方法
  • move(piece, originalSquare, destinationSqueare)
  • place(piece, square)
  • remove(piece)
  • promote(originalPiece, finalPiece)
  • ...

这些方法将使用PieceSquare中的基本方法,并且将是您的主逻辑使用的方法

答案 1 :(得分:1)

在我看来,你正在推翻从Piece移除Board的过程。

游戏将以Board课程为中心。从Piece中删除Board后,该片就消失了;你再也不会做任何事了。你不会调用任何方法或任何东西。那个对象现在已经死了 - 无法到达。因此,实际上没有任何理由可以更改Piece的状态以使其Board引用无效。

这确实是一种非常常见的模式,通常的做法就是放手。一旦没有人再引用Piece,你就完成了;不再重要 Piece仍然恰好引用了Board。让它保持参考;它不会造成任何伤害(因为没有人会再用那个Piece做任何事情),并且它很快就会被垃圾收集。