using ProjectAirplaneWithRadar.Drawnings; using ProjectAirplaneWithRadar.Exceptions; namespace ProjectAirplaneWithRadar.CollectionGenericObjects { /// /// Абстракция компании, хранящий коллекцию автомобилей /// public abstract class AbstractCompany { /// /// Размер места (ширина) /// protected readonly int _placeSizeWidth = 210; /// /// Размер места (высота) /// protected readonly int _placeSizeHeight = 110; /// /// Ширина окна /// protected readonly int _pictureWidth; /// /// Высота окна /// protected readonly int _pictureHeight; /// /// Коллекция автомобилей /// protected ICollectionGenericObjects? _collection = null; /// /// Вычисление максимального количества элементов, который можно разместить в окне /// private int GetMaxCount => _pictureWidth / _placeSizeWidth * (_pictureHeight / _placeSizeHeight); /// /// Конструктор /// /// Ширина окна /// Высота окна /// Коллекция автомобилей public AbstractCompany(int picWidth, int picHeight, ICollectionGenericObjects collection) { _pictureWidth = picWidth; _pictureHeight = picHeight; _collection = collection; _collection.MaxCount = GetMaxCount; } /// /// Перегрузка оператора сложения для класса /// /// Компания /// Добавляемый объект /// public static int operator +(AbstractCompany company, DrawningAirplane airplane) { return company._collection.Insert(airplane, new DrawningAirplaneEqutables()); } /// /// Перегрузка оператора удаления для класса /// /// Компания /// Номер удаляемого объекта /// public static DrawningAirplane operator -(AbstractCompany company, int position) { return company._collection.Remove(position); } /// /// Получение случайного объекта из коллекции /// /// public DrawningAirplane? GetRandomObject() { Random rnd = new(); try { return _collection?.Get(rnd.Next(GetMaxCount)); } catch (ObjectNotFoundException) { return null; } } /// /// Вывод всей коллекции /// /// public Bitmap? Show() { Bitmap bitmap = new(_pictureWidth, _pictureHeight); Graphics graphics = Graphics.FromImage(bitmap); DrawBackgound(graphics); SetObjectsPosition(); for (int i = 0; i < (_collection?.Count ?? 0); ++i) { try { DrawningAirplane? obj = _collection?.Get(i); obj?.DrawTransport(graphics); } catch (ObjectNotFoundException) { continue; } } return bitmap; } /// /// Вывод заднего фона /// /// protected abstract void DrawBackgound(Graphics g); /// /// Расстановка объектов /// protected abstract void SetObjectsPosition(); /// /// Сортировка /// /// Сравнитель объектов public void Sort(IComparer comparer) => _collection?.CollectionSort(comparer); } }