0

我正在制作一个使用块的地图加载系统,这样就不必一次加载整个地图数据。

我有一个“World”类,在该类中我创建了一个名为“ChunkManager”的类的实例。

我不确定在另一个类中创建一个实例是否是一个好主意/被认为是一个“正常”的事情等等。我在搜索互联网时找不到任何关于这个的东西。

所以我的问题是:我应该以我拥有的方式在一个类中创建一个类的实例,还是这样做会有问题?

这是我的代码,如果相关的话:

class World
{

    public string WorldName { get; set; }
    ChunkManager chunkManager = new ChunkManager();


    public World(string worldName)
    {
        WorldName = worldName;

    }

    public void AddChunk(int X, int Y)
    {
        //Plus other validation code here that I didn't paste
        chunkManager.AddChunk(X, Y);
    }
}

和块管理器:

class ChunkManager
{
    public int TotalGeneratedChunks { get; private set; }

    private List<Chunk> ChunkList = new List<Chunk>();

    public bool CheckIDExists(int IDToCheck)
    {
        foreach (Chunk i in ChunkList)
        {
            if (i.UniqueID == IDToCheck)
            {
                return true;
            }
        }

        return false;
    }

    public void AddChunk(int X, int Y)
    {
        ChunkList.Add(new Chunk(TotalGeneratedChunks++, X, Y));

    }
}
4

5 回答 5

4

您的代码很好,但是如果任一类变得更复杂并且您希望能够独立测试它们,您应该定义一个接口 IChunkmanager 并将 ChunkManager 的实例注入 World:

class World
{

    public string WorldName { get; set; }
    private readonly IChunkManager chunkManager;


    public World(string worldName, IChunkManager chunkmanager)
    {
        this.chunkManager = chunkManager;
        ...

通过这种方法,您可以使用模拟框架来注入模拟IChunkManager并可以独立测试World类。

一般来说,类应该是松耦合的。一旦你在一个类中新建另一个类的实例,你就会以一种难以独立测试它们(或在不同情况下重用它们)的方式将它们紧密绑定。

于 2013-09-20T04:40:26.590 回答
2

在另一个类中创建一个类的实例是非常好的。chunkManager是所谓的 a field,用于内联初始化它的语法及其声明称为 an initializer。您可以在 Eric Lippert 的本博客系列中找到有关初始化程序的更多信息以及它们与通过构造函数进行初始化的不同之处

第 1 部分 第 2 部分

有时通过构造函数初始化字段可能是一个更好的主意,因为这允许您使用依赖注入(准确地说是参数注入),这可以大大提高代码的可测试性和模块化。如果您有兴趣了解有关依赖注入的更多信息,我建议您购买并阅读本书。

于 2013-09-20T03:19:22.370 回答
1

标准做法是在构造函数内设置值,因为它允许依赖注入并使修改构造函数以使用参数变得非常容易。

于 2013-09-20T03:33:26.503 回答
0

是的,你可以在另一个类中使用一个类类型,就像在这个类中提交的一个类一样,当你使用 string a=new string() 你使用类字符串的对象它的正常代码

于 2013-09-20T05:18:59.323 回答
0

如果你要创建很多世界,我建议创建一个实现 ChunckManager 的抽象基础。

这样你就可以充分利用基类,促进代码重用。你也可以让你的 ChunkManager 单例,因为它只需要被基础使用,然后如果你需要地图的特定属性,然后使用一种方法来实际实例化 ChunkManager。

使用 DI 将 prop 从 child 传递到 base 以实例化 ChunkManager

于 2013-09-20T04:27:57.187 回答