C# 一个类的属性是另一个类,反之亦然
我正在用C语言编写一个棋盘游戏,其中两个最重要的类是C# 一个类的属性是另一个类,反之亦然,c#,oop,design-patterns,C#,Oop,Design Patterns,我正在用C语言编写一个棋盘游戏,其中两个最重要的类是Piece和Square。通常,Piece的每个实例都有一个Square(作为属性),而Square的每个实例都可能有一个Piece(也作为属性)或为空 我将代码放在Square.Piece和Piece.Square的集合方法中,以确保保持这种关系(例如,当一个块从一个正方形移动到另一个正方形时),并避免链接属性在无休止的循环中调用彼此的集合方法的明显危险 但是,当一个块从电路板上移除,并且它的正方形设置为“null”时,我似乎有太多的if语句
Piece
和Square
。通常,Piece
的每个实例都有一个Square
(作为属性),而Square
的每个实例都可能有一个Piece
(也作为属性)或为空
我将代码放在Square.Piece
和Piece.Square
的集合方法中,以确保保持这种关系(例如,当一个块从一个正方形移动到另一个正方形时),并避免链接属性在无休止的循环中调用彼此的集合方法的明显危险
但是,当一个块
从电路板上移除,并且它的正方形
设置为“null”时,我似乎有太多的if语句来避免null异常,而概念上看似非常简单的模式在实践中变得过于复杂和容易出错
我想知道我的整个方法是否都错了。当square
也将piece
作为属性时,piece
是否应该将square
作为属性?我真的开始编写反模式了吗?片段
的正方形
在创建时可能为空,而正方形
的片段
通常为空(表示为空)。我应该用另一种方法来表示没有在黑板上的空方块和块吗
我假设对于一个类与另一个类以这样的双向关系链接的更一般的情况,有更好的、健壮的解决方案
非常感谢您的建议。使用更高级别的抽象,方法如下
move(工件、原始方格、目的地)
放置(块、正方形)
拆下(件)
promote(原始片段、最终片段)
- 李>
这些方法将使用
Piece
和Square
中的基本方法,并且将是您的主要逻辑所使用的方法。在我看来,您似乎过度考虑了从板上删除Piece
的过程
游戏将以棋盘
类为中心。一旦你从板
上取下一块
,那块就不见了;你再也不会用它做任何事了。您不会调用它的任何方法或任何东西。那个物体现在死了--无法到达。因此,实际上没有任何理由更改块的状态,以使其板的引用无效
这确实是一种非常常见的模式,通常的做法是放手不管。一旦不再有人引用片段
,你就完了;块
仍然碰巧引用板
不再重要。让它保留它的参考;它不会造成任何伤害(因为没有人会再使用块做任何事情),而且它很快就会被垃圾收集。这个问题属于Stack Exchange网络中的另一个站点-programmers.stackexchange.comIs square元素板?把要搬上船的那块拼成块?如果是,那么我认为您不需要方形属性作为一个成员。此附加信息不会为您提供有用的附加信息,因为目前还没有班级“董事会”。我刚刚用了一个二维正方形阵列。。。正方形[,]板=正方形[x,y]。但我认为我现在应该有类板,因为虽然它只会有一个实例,但SJuan76下面建议的所有高级方法,如move(piece,originalSquare…)等,应该属于板。非常感谢。我想知道这是否是一条可行之路——但在我做出如此重大的改变之前,我希望得到更有经验的程序员的确认。因此,像您建议的那样对方法进行编码,从而从Piece和Square的属性中删除链接代码。Re:null的问题,看看NullObject模式,例如,定义具有适当行为的Piece.Empty、Square.OffBoard对象来代替null值。谢谢。我已经做到了。在父类中将这些空对象实现为它们自己类型的静态公共字段似乎效果不错。我假设这会产生一些与递归相关的错误。但是现在,例如,第一行代码是:classpiece{publicstaticpiecnone=newpiece(“no Piece”)59。