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使用的一组方法

c#基类有一个派生类成员,它循环

老实说,继承在这里没有任何意义。继承是一种"是类型"的关系(换句话说,GameGameData的类型吗?)我很怀疑。

使用组合!只需让类保存它们关心的对象。构图是一种"有"关系,这在你的情况下更有意义。老实说,我会颠倒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实例传递给构造函数,而不是创建一个新的——在不了解整体设计的情况下,很难说什么是正确的