diff --git a/ProjectMonorail/Scripts/Monorail/CollectionGenericObjects/ICollectionGenericObjects.cs b/ProjectMonorail/Scripts/Monorail/CollectionGenericObjects/ICollectionGenericObjects.cs
new file mode 100644
index 0000000..4509b8d
--- /dev/null
+++ b/ProjectMonorail/Scripts/Monorail/CollectionGenericObjects/ICollectionGenericObjects.cs
@@ -0,0 +1,50 @@
+namespace ProjectMonorail.Scripts.Monorail.CollectionGenericObjects
+{
+ ///
+ /// Интерфейс описания действий для набора хранимых объектов
+ ///
+ /// Параметр: ограничение - ссылочный тип
+ public interface ICollectionGenericObjects
+ where T : class
+ {
+ ///
+ /// Количество объектов в коллекции
+ ///
+ int Count { get; }
+
+ ///
+ /// Установка максимального количества элементов
+ ///
+ int SetMaxCount { set; }
+
+ ///
+ /// Добавление объекта в коллекцию
+ ///
+ /// Добавляемый объект
+ /// true - вставка прошла удачно, false - вставка не удалась
+ bool Insert(T obj);
+
+ ///
+ /// Добавление объекта в коллекцию на конкретную позицию
+ ///
+ /// Добавляемый объект
+ /// Позиция
+ /// true - вставка прошла удачно, false - вставка не удалась
+ bool Insert(T obj, int position);
+
+ ///
+ /// Удаление объекта из коллекции с конкретной позиции
+ ///
+ /// Позиция
+ /// true - удаление прошло удачно, false - удаление не удалось
+ bool Remove(int position);
+
+ ///
+ /// Получение объекта по позиции
+ ///
+ /// Позиция
+ /// Объект
+ T? Get(int position);
+
+ }
+}
diff --git a/ProjectMonorail/Scripts/Monorail/CollectionGenericObjects/MassiveGenericObjects.cs b/ProjectMonorail/Scripts/Monorail/CollectionGenericObjects/MassiveGenericObjects.cs
new file mode 100644
index 0000000..af8ad8d
--- /dev/null
+++ b/ProjectMonorail/Scripts/Monorail/CollectionGenericObjects/MassiveGenericObjects.cs
@@ -0,0 +1,107 @@
+namespace ProjectMonorail.Scripts.Monorail.CollectionGenericObjects
+{
+ public class MassiveGenericObjects : ICollectionGenericObjects
+ where T : class
+ {
+ ///
+ /// Массив объектов, которые храним
+ ///
+ private T?[] _collection;
+
+ public int Count => _collection.Length;
+
+ public int SetMaxCount
+ {
+ set
+ {
+ if (value > 0)
+ {
+ if (_collection.Length > 0)
+ {
+ Array.Resize(ref _collection, value);
+ }
+ else
+ {
+ _collection = new T?[value];
+ }
+ }
+ }
+ }
+
+
+ ///
+ /// Конструктор
+ ///
+ public MassiveGenericObjects()
+ {
+ _collection = Array.Empty();
+ }
+
+ public T? Get(int position)
+ {
+ // TODO проверка позиции
+ return _collection[position];
+ }
+
+ public bool Insert(T obj)
+ {
+ // TODO вставка в свободное место набора
+ for (int i = 0; i < Count; i++)
+ {
+ if (InsertingElementCollection(i, obj)) return true;
+ }
+
+ return false;
+ }
+
+ public bool Insert(T obj, int position)
+ {
+ // TODO проверка позиции
+ // TODO проверка, что элемент массива по этой позиции пустой, если нет, то
+ // ищется свободное место после этой позиции и идет вставка туда
+ // если нет после, ищем до
+ // TODO вставка
+
+ if (InsertingElementCollection(position, obj)) return true;
+
+ for (int i = position + 1; i < Count; i++)
+ {
+ if (InsertingElementCollection(i, obj)) return true;
+ }
+
+ for (int i = position - 1; i >= 0; i--)
+ {
+ if (InsertingElementCollection(i, obj)) return true;
+ }
+
+ return false;
+ }
+
+ public bool Remove(int position)
+ {
+ // TODO проверка позиции
+ // TODO удаление объекта из массива, присвоив элементу массива значение null
+
+ if (_collection[position] == null) return false;
+
+ _collection[position] = null;
+
+ return true;
+ }
+
+ ///
+ /// Если элемент массива пустой, то происходит вставка нового элемента
+ ///
+ /// Индекс элемента
+ /// Элемент
+ /// false - элемент массива не равен null, true - равен null
+ private bool InsertingElementCollection(int index, T obj)
+ {
+ if (_collection[index] != null) return false;
+
+ _collection[index] = obj;
+ return true;
+ }
+
+ }
+}
\ No newline at end of file