#c# #list #object
Вопрос:
На рисунке выше изображена моя диаграмма классов. Однако у меня есть проблема. В моем классе формы заказа я хотел бы отобразить время доставки всех деталей в порядке, которого нет на складе. Однако я не могу попасть на склад удобным способом. Я не могу просто создать объект, так как его запас будет отличаться от того, который фактически используется мастерской, и я не могу сделать список доступных частей статичным, так как это означало бы, что все будущие склады будут иметь один и тот же запас.
Кто — нибудь знает обходной путь для этого?
Ответ №1:
Почему бы вам просто не передать склад на заказ? Вы даже можете зайти так далеко, чтобы извлечь интерфейс, что-то вроде IStockManager, который публикует метод GetStock, реализует его на вашем складе, а затем передает его в порядок.
Существует много способов подключения этих классов, некоторые из них менее связаны, чем другие, и это зависит от вашей архитектуры, но я думаю, что способ, о котором я упоминал выше, подходит для ваших нужд.
Редактировать:
Как и было запрошено, вот пример очень простого класса «посредник». Это не совсем соответствует шаблону, но этого должно быть достаточно, чтобы вывести вас на правильный путь.
По сути, посредник в вашем случае должен инициализировать все объекты и опубликовать методы, к которым вы хотите, чтобы другие классы имели доступ.
public class Mediator
{
private readonly WareHouse _wareHouse;
private readonly OrderForm _orderForm;
public Mediator()
{
_wareHouse = new WareHouse();
_orderForm = new OrderForm(this);
}
public int GetStock(Part part)
{
return _wareHouse.GetStock(part);
}
}
В основном посредник содержит методы, доступные для всех классов, которые знают о посреднике. Как вы можете видеть, мы передаем Посредника конструктору формы заказа, поэтому форма заказа теперь знает о Посреднике и его методе(GetStock).
public class OrderForm
{
private readonly Mediator _mediator;
public OrderForm(Mediator mediator)
{
_mediator = mediator;
var stock = _mediator.GetStock(yourPart);
// Now you can call WareHouse.GetStock(yourPart) through the
mediator
}
}
Я не знаю, действительно ли правильно называть этот класс посредником, поскольку он не совсем соответствует шаблону, но этого достаточно для простого приложения, и вы можете прочитать об этом, если хотите правильно его реализовать.
Комментарии:
1. если я передам склад на заказ, не будет ли это означать объявление нового объекта склада в классе order? Правка: Это, вероятно, сработало бы, просто объявив склад, как это не было бы: частный склад склад;
2. У вас может быть класс, который создает все необходимые экземпляры, а затем передает их через конструктор. Если вы хотите узнать больше об этом виде процесса, вы можете посмотреть инъекцию зависимостей. Самый простой способ добиться этого-создать класс, который вызывается при запуске вашего приложения , создать
new WareHouse
его, а затемnew OrderForm(WareHouse)
. Если бы вы хотели ограничить доступ к хранилищу,OrderForm
вы могли бы создать интерфейс, о котором я упоминал ранее, иOrderForm
указать acceptIStockManager
в качестве параметра в его конструкторе.3. Другим способом может быть просто наличие класса «Посредник», который имеет ссылки на все объекты и передается всем объектам, которые в нем нуждаются. Этот класс будет соединителем между вашими классами. Таким образом, вы можете сделать что-то вроде этого:
Mediator.GetStock(itemid)
и Посредник позвонитWareHouse.GetStock(itemId)
. Таким образом, форма заказа не будет иметь представления о складе и будет знать только о Посреднике и методах, которыми он владеет.4. Как я уже сказал, есть много способов достичь этого, и все зависит от архитектурных решений. В случае, если вы посмотрите термины, которые я упомянул выше, есть пакеты, которые делают именно это, но нет необходимости использовать их, если ваше приложение простое, вы можете реализовать эти шаблоны самостоятельно.
5. Я провел целый день на занятиях по медиации, но на самом деле это не работает. Не могли бы вы описать в коде, как будет выглядеть простой класс посредника?