2013-09-20 3 views
0

Я создаю систему загрузки карт, в которой используются куски, чтобы сразу не загружать все данные карты.C# Создание объекта внутри класса

У меня есть класс «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)); 

    } 
} 
+3

Существует абсолютно нет проблема в этом, –

+0

Это работает так, как вы ожидали? – OneFineDay

+0

Если бы вы прочитали * какой-либо код вообще в своих путешествиях, вы бы увидели это точно в каждом фрагменте кода, который вы видели. Когда вы что-то так же просто, как создание/инициализация новой строки, вы «создаете объект внутри класса», как вы выразились. – slugster

ответ

4

Вашего кода это хорошо, но если один класс растет, чтобы быть более сложными, и вы хотите, чтобы иметь возможность проверить их независимо друг от друг, вы должны вместо этого определить интерфейс IChunkmanager и впрыснуть экземпляр ChunkManager в мир:

class World 
{ 

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


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

При таком подходе вы можете использовать насмешливые рамки, чтобы придать ложный IChunkManager и можете протестировать World класс самостоятельно.

В целом классы должны быть слабо связаны. Как только вы обновляете экземпляр другого класса внутри класса, вы плотно привязываете его таким образом, чтобы его было сложно проверить самостоятельно (или повторно использовать в разных ситуациях).не

+1

~ Через 2 года и после того, как я улучшил свои знания намного больше, и я понимаю инъекцию зависимостей и интерфейсы, я понимаю ваш ответ намного больше. Благодаря! – user9993

2

Это прекрасно, чтобы создать экземпляр класса внутри другого. chunkManager - это то, что известно как field, и синтаксис для инициализации его встроенного вместе с его объявлением называется initializer. Вы можете найти более подробную информацию о инициализаторах и как они отличаются от инициализации с помощью конструктора этой серии блог Эрика Липперт

Part 1 Part 2

Это может несколько раз быть лучшей идеей для инициализации полей с помощью конструктора, хотя так как это позволяет вам использовать инъекцию зависимостей (точнее, инжекцию параметров), что может значительно улучшить тестируемость и модульность вашего кода. Если вам интересно узнать больше об инъекции зависимостей, я предлагаю приобрести и прочитать книгу this.

1

Стандартная практика заключается в том, чтобы устанавливать значения внутри конструктора, потому что он допускает инъекцию зависимостей и позволяет модифицировать конструктор, чтобы использовать аргумент тривиально простым.

0

Если вы собираетесь создать много Мира, я предлагаю создать абстрактную базу, которая реализует ChunckManager.

Таким образом, вы можете использовать использование базового класса, продвигать повторное использование кода. Вы также можете сделать свой синглтон ChunkManager, так как он должен использоваться базой, а затем использовать метод для фактического создания экземпляра ChunkManager, если вам нужны конкретные свойства из карт.

Использование DI передать пропеллер от ребенка основывать на инстанциацию ChunkManager

0

да, вы можете использовать один тип класса в другом классе его как один из поданных на этот класс, как при использовании строки а = новая строка() используется объект класса строки его нормального кода

Смежные вопросы