c#基类有一个派生类成员,它循环
本文关键字:循环 成员 基类 有一个 派生 | 更新日期: 2023-09-27 18:12:56
我有这样一个类:
public class GameData
{
public int[,] mat { get; set; }
public int dim { get; set; }
public int goal { get; set; }
public Game game { get; set; }
public GameData()
{
game = new Game();
}
}
和其他两个派生类:
public class Game :GameData
{
private Mover m;
public Game()
{
dim = 4;
goal = 16;
mat = new int[dim, dim];
m = new Mover();
}
/*Methods*/
}
public class Mover : GameData
{
/*Methods*/
}
它循环是因为Game
构造函数调用GameData
构造函数等等。我该怎么办?我开始使用面向对象编程,我不确定这三个类是设置程序的最佳方式。GameData
包含常用数据,Game
包含播放方法,Mover
包含Game
使用的一组方法
老实说,继承在这里没有任何意义。继承是一种"是类型"的关系(换句话说,Game
是GameData
的类型吗?)我很怀疑。
使用组合!只需让类保存它们关心的对象。构图是一种"有"关系,这在你的情况下更有意义。老实说,我会颠倒Game
/GameData
的关系,Game
可能持有GameData
;而不是反过来。只有你自己知道你需要什么。
public class GameData
{
public int[,] mat { get; set; }
public int dim { get; set; }
public int goal { get; set; }
public Game game { get; set; }
public GameData()
{
game = new Game();
dim = 4;
goal = 16;
mat = new int[dim, dim];
}
}
public class Game
{
private Mover m;
public Game()
{
m = new Mover();
}
/*Methods*/
}
public class Mover
{
/*Methods*/
}
这句话
公共GameData (){game = new game ();}
没有意义;因为GameData是父元素,所以在父元素中包含子元素是不符合逻辑的。显然,这就形成了一个循环,因为你在用这句话反复创建Game: GameData。
考虑一下你想要的继承,因为你在Mover中也不正确地使用了它。
你确实有一个循环引用,这是一种设计味道。可以通过检查null
:
public GameData()
{
if(game == null)
game = new Game();
}
或者将Game
实例传递给构造函数,而不是创建一个新的——在不了解整体设计的情况下,很难说什么是正确的