Интерфейсы

Всем снова привет! Натолкните на мысль в выполнении этого задания:

Разработать архитектуру классов иерархии товаров при разработке
системы управления потоками товаров для дистрибьюторской
компании. Прописать члены классов.
Должны быть предусмотрены разные типы товаров, в том числе:

  • Бытовая химия;
  • Продукты питания.
    Предусмотреть интерфейсы:
  • Скоропортящиеся продукты;
  • Ликеро-водочные продукты и табачные изделия (акцизные
    продукты);
  • Легковоспламеняющиеся товары;
  • Бьющиеся товары.
    Предусмотреть классы управления потоком товаров (пришло,
    реализовано, списано, передано).

Я сделал абстрактный класс “Товар”, потом от него унаследовал два абстрактных класса “Продукты” и “Химия”. Написал рализацию 4-х неоходимых интерфейсов, и написал несколько классов (от класса “Продукты” или “Химия”), с реализацией одного или нескольких интерфейсов.
Не пойму как правильно реализовать это:

Предусмотреть классы управления потоком товаров (пришло,
реализовано, списано, передано)

:man_shrugging: по такому описанию сложно что-то придумать, без понимания какую задачу это должно решать. Слишком абстрактно.

Гугл выдал несколько решений, можно вдохновляться:
https://www.google.com/search?q=Предусмотреть+классы+управления+потоком+товаров+(пришло%2Cреализовано%2C+списано%2C+передано).

Я это видел. Вот подумал, может сделать какой-то класс с массивом продуктов и методами добавления/удаления, а потом, в зависимости от условий, добавлять или удалять их в классы “Списано”, “Продано”, “Приход” и “Передано”. Только вот не совсем понимаю как это сделать?

А зачем тут классы? Это просто списки, а не классы.

Точнее вместо добавления в списки можно просто добавить свойство Статус (enum, …), менять его, потом фильтровать когда надо получить список чего-то.

var soldItems = items.Where(it => it.Status == ItemStatus.Sold);

Я уточнил, так вот нужно сделать базовый Класс “Товары” с полем Product [] arr и двумя методами добавления/удаления, потом от него унаследовать 4 класса движения товаров. А потом в Мэйне создать экземпляр класса “Приход” и туда добавить разные продукты и так далее. Я вроде бы сделал. Но при выводе на экран вылетает исключение, указывающее на GetEnumerator() и строку в Мэйне с циклом.

Необработанное исключение: System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
в InterfacesDistribution.Merchandise.GetEnumerator() в e:\Study\C#\Projects\InterfacesDistribution\Merchandise.cs:строка 22
в InterfacesDistribution.Program.Main(String[] args) в e:\Study\C#\Projects\InterfacesDistribution\Program.cs:строка 22

Не подскажете как это исправить?

Так а в коде что?

Что за тяга в каждой задаче переизобретать динамический массив? Там точно не просто List имели в виду?)

Даже не знаю, что вам скинуть. Я сделал какой-то костыль, но оно вроде работает. Если конечно я правильно понял, что от меня хотят:

 public class Merchandise : IEnumerable
    {
        private Product[] _arr;
        public Product this[int pos]
        {
            get => _arr[pos];
            set => _arr[pos] = value;
        }
        public int Length => _arr.Length;
        public IEnumerator GetEnumerator()
        {
            return _arr.GetEnumerator();
        }
        public Merchandise(int Length) 
        {
            _arr = new Product[Length];
        }
        public virtual void AddProduct(Product value)
        {
            Product[] newArr = new Product[_arr.Length + 1];
            newArr[_arr.Length] = value;
            for(int i=0;i<_arr.Length;i++)
            {
                newArr[i] = _arr[i];
            }
            _arr = newArr;
        }
        public virtual void DelProduct(int pos)
        {
            Product[] newArr = new Product[_arr.Length - 1];
            for (int i = 0; i < pos; i++)
            {
                newArr[i] = _arr[i];
            }
            for (int i = pos; i < newArr.Length; i++)
            {
                newArr[i] = _arr[i + 1];
            }
            _arr = newArr;
        }
    }
class Program
    {
        static void Main(string[] args)
        {
            Shampoo a = new Shampoo("Axe", 3, Type.Hypoallergenic, new DateTime(2022, 10, 21), false);
            Eggs b = new Eggs("Village", 2, 80, false, new DateTime(2020, 12, 5));            
            Cigars c = new Cigars("Cohiba", 10, 0, 5);
           
            Receipt products = new Receipt(0);
            products.AddProduct(a);
            products.AddProduct(b);
            products.AddProduct(b);
            products.DelProduct(2);
            foreach (var item in products)
            {
                Console.WriteLine(item);   
            }
            
        }
    }

arr надо создать пустой изначально, чтобы до вызова AddProduct цикл тоже работал. 0 для этого можно не передавать в конструктор )

Ну а вообще лучше просто взять List, тогда не надо пересоздавать постоянно.

1 Симпатия