我正在制作一个使用块的地图加载系统,这样就不必立即加载整个地图数据。
我有一个“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);
}
}
和ChunkManager:
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));
}
}
答案 0 :(得分: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
类。
一般来说,课程应松散耦合。一旦你在一个类中新建一个另一个类的实例,你就会以一种难以独立测试它们的方式对它们进行紧密绑定(或者在不同的情况下重用它们)。
答案 1 :(得分:2)
在另一个内部创建一个类的实例是完全正常的。 chunkManager
是所谓的field
,其内联及其声明初始化的语法称为initializer
。您可以在Eric Lippert的博客系列中找到有关初始值设定项的更多信息以及它们与通过构造函数初始化的不同之处
通过构造函数初始化字段有时可能更好一点,因为这样可以使用依赖注入(参数注入准确),这可以极大地提高代码的可测试性和模块性。如果您有兴趣了解有关依赖注入的更多信息,我建议您购买并阅读this本书。
答案 2 :(得分:1)
标准做法是在构造函数中设置值,因为它允许依赖注入,并且修改构造函数以便轻松使用参数。
答案 3 :(得分:0)
如果你要创建很多World,我建议创建一个实现ChunckManager的抽象基础。
通过这种方式,您可以利用基类,促进代码重用。你也可以制作你的ChunkManager单例,因为它只需要被基础使用,然后如果你需要地图中的特定属性,则使用一种方法来实际实例化ChunkManager。
使用DI将prop从child传递给base到chunkManager的实例化
答案 4 :(得分:0)
是的,你可以在另一个类中使用一个类类型,就像你在这个类中提到的类一样,当你使用字符串a = new string()时,你使用类字符串的对象,它的正常代码