Как мне получить доступ к списку, который не подключен к моему классу

#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 указать accept IStockManager в качестве параметра в его конструкторе.

3. Другим способом может быть просто наличие класса «Посредник», который имеет ссылки на все объекты и передается всем объектам, которые в нем нуждаются. Этот класс будет соединителем между вашими классами. Таким образом, вы можете сделать что-то вроде этого: Mediator.GetStock(itemid) и Посредник позвонит WareHouse.GetStock(itemId) . Таким образом, форма заказа не будет иметь представления о складе и будет знать только о Посреднике и методах, которыми он владеет.

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

5. Я провел целый день на занятиях по медиации, но на самом деле это не работает. Не могли бы вы описать в коде, как будет выглядеть простой класс посредника?