Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
7 / 0 / 0
Регистрация: 18.05.2018
Сообщений: 158

Как реализовать более абстрактную реализацию, при которой добавление новых типов животных не будет требовать модификации

18.02.2022, 15:20. Показов 725. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Есть задача: Реализовать объектно-ориентированную систему: прототип сбора продукции. Реализовать структуру классов, задействовать механизм наследования.

Класс фермы (Farm) должен быть автономным, сам вести учёт номеров животных, сбор и подсчет продукции. Решение должно быть расширяемым, добавление новых типов животных и продукции не должно приводить к модификации непосредственно класса Farm.



Система должна уметь:

Добавлять животных в хлев поштучно.
Собирать продукцию у всех животных, зарегистрированных в хлеву.
Подсчитывать общее кол-во собранной продукции.

При запуске скрипта в консоли:

Система должна добавить животных в хлев (10 коров и 20 кур).
Вывести на экран информацию о количестве каждого типа животных на ферме.
7 раз (неделю) произвести сбор продукции (подоить коров и собрать яйца у кур).
Вывести на экран общее кол-во собранных за неделю шт. яиц и литров молока.
Добавить на ферму ещё 5 кур и 1 корову (съездили на рынок, купили животных).
Снова вывести информацию о количестве каждого типа животных на ферме.
Снова 7 раз (неделю) производим сбор продукции и выводим результат на экран.

Реализация задания:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
class Program
    {
        static void Main(string[] args)
        {
            Farm farm = new Farm();
 
            farm.Work();
        }
    }
 
    class Farm
    {
        private string[] _weekDay = { "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье" };
        private Stable _stable = new Stable();
 
        private void CollectProduct()
        {
            for (int i = 0; i < _weekDay.Length; i++)
            {
                Console.WriteLine(_weekDay[i]);
                _stable.CollectProduct();
            }
        }
 
        public void Work()
        {
            _stable.Initialize();
            _stable.Information();
 
            CollectProduct();
 
            Console.WriteLine(_stable.GetAllAmountProducts());
 
            _stable.AddNewAnimals();
            _stable.Information();
 
            CollectProduct();
 
            Console.WriteLine(_stable.GetAllAmountProducts());
        }
    }
 
    class Stable
    {
        private List<Product> _products = new List<Product>();
        private List<Animal> _animals = new List<Animal>();
 
        private int _template = 1;
 
        public void Initialize()
        {
            int registrationNumber;
 
            int animalsAmount = 30;
 
            for (int i = 0; i < animalsAmount; i++)
            {
                registrationNumber = _template;
 
                if (i < 9)
                    _animals.Add(new Cow(8, 13, registrationNumber));
                else
                    _animals.Add(new Chicken(0, 2, registrationNumber));
 
                _template++;
            }
        }
 
        public void CollectProduct()
        {
            Random random = new Random();
            var animal = _animals[random.Next(0, _animals.Count)];
            int product = animal.GetProduct();
 
            Console.WriteLine($"Собрано {product} продукта у животного под регистрационным номером {animal.RegistrationNumber}");
 
            _products.Add(new Product(animal, product));
        }
 
        public void Information()
        {
            for (int i = 0; i < _animals.Count; i++)
            {
                _animals[i].Information();
            }
        }
 
        public int GetAllAmountProducts()
        {
            int allAmount = 0;
 
            for (int i = 0; i < _products.Count; i++)
            {
                allAmount += _products[i].Amount;
            }
 
            return allAmount;
        }
 
        public void AddNewAnimals()
        {
            int animalsAmount = 6;
 
            for (int i = 0; i < animalsAmount; i++)
            {
                if (i < 1)
                    _animals.Add(new Cow(8, 13, _template));
                else
                    _animals.Add(new Chicken(0,2,_template));
 
                _template++;
            }
        }
    }
 
    class Product
    {
        private Animal _animal;
        private int _amount;
 
        public int Amount => _amount;
 
        public Product(Animal animal,int amount)
        {
            _animal = animal;
            _amount = amount;
        }
        
        public void Information()
        {
            Console.WriteLine($"Количество продукта {_amount} у животного в регистрационным номером {_animal.RegistrationNumber}");
        }
    }
 
    class Chicken : Animal
    {
        private int _minValueProductCollection;
        private int _maxValueProductCollection;
 
        public Chicken(int minValueProductCollection, int maxValueProductCollection, int registrationNumber) : base(registrationNumber)
        {
            _minValueProductCollection = minValueProductCollection;
            _maxValueProductCollection = maxValueProductCollection;
        }
 
        public override int GetProduct()
        {
            Random random = new Random();
            int productAmount = 0;
 
            productAmount = random.Next(_minValueProductCollection, _maxValueProductCollection);
 
            return productAmount;
        }
    }
 
    class Cow : Animal
    {
        private int _minValueProductCollection;
        private int _maxValueProductCollection;
 
        public Cow(int minValueProductCollection, int maxValueProductCollection, int registrationNumber) : base(registrationNumber)
        {
            _minValueProductCollection = minValueProductCollection;
            _maxValueProductCollection = maxValueProductCollection;
        }
 
        public override int GetProduct()
        {
            Random random = new Random();
            int productAmount = 0;
 
            productAmount = random.Next(_minValueProductCollection, _maxValueProductCollection);
 
            return productAmount;
        }
    }
 
    abstract class Animal
    {
        private int _registrationNumber;
 
        public int RegistrationNumber => _registrationNumber;
 
        public Animal(int registrationNumber)
        {
            _registrationNumber = registrationNumber;
        }
 
        public abstract int GetProduct();
 
        public void Information()
        {
            Console.WriteLine($"{GetType().Name} - регистрационный номер {_registrationNumber}");
        }
    }
Препод принял код,но попросил реализовать более абстрактную реализацию, при которой добавление новых типов животных не будет требовать модификации имеющихся классов, не считая добавление нового класса для самого животного.

Я так понял,что нужно реализовать добавление новых животных в хлев так,чтобы добавление не было завязано на конкретных типах животных. Я думал так: мне нужно добавить какое-то колво куриц и коров. Если нужно реализовать более абстрактную реализацию добавления животных,то я могу просто написать new Animal(.....) при добавлении. Но будет неизвестно ,что это за животное корова или курица. Можно,конечно, сделать downcasting при добавлении животного,но animal не является курицей или коровой и поэтому появится ошибка.

В общем, не знаю как реализовать эту абстрактную реализацию.

Помогите ,пожалуйста!

Заранее спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.02.2022, 15:20
Ответы с готовыми решениями:

Добавление новых типов в функцию
function mb_filter_user_type() { if(Params::getParam('sCompany') &lt;&gt; '' and Params::getParam('sCompany') &lt;&gt; null) { ...

Как ограничить время выполнения функции и реализовать добавление новых функций
Есть код, поочерёдно вызывающий функции на равный промежуток времени, но функции бесконечные и их ограниченное количество новых функций ...

Можно ли опубликовть приложение из VS 2013, которое не будет требовать Framework 4.5.1 при установке?
Здравствуйте! Столкнулся с такой проблемой. Публикую приложение в Visual Studio 2013, затем запускаю установщик на клиенте (Win XP)....

3
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
18.02.2022, 16:06
Цитата Сообщение от roma1808 Посмотреть сообщение
при которой добавление новых типов животных не будет требовать модификации имеющихся классов, не считая добавление нового класса для самого животного.
Строки 60-63 у вас явным образом используют типы животных, то есть если понадобится добавиться какого-нибудь экзотического гуся, то будет еще строка типа:
C#
1
_animals.Add(new ExoticGoose(0, 2, registrationNumber));
Вас, видимо, попросили сделать так, чтобы класс Farm не был осведомлен (не имел ссылок) о конкретных типах животных.
Для этого в ООП используется паттерн Абстрактная Фабрика, в вашем случае что-то вроде того:
C#
1
2
3
4
5
6
interface IAnimalFactory {
 
   Animal CreateCow(...);
   Animal CreateChicken(...);
   Animal CreateExoticGoose(...);
}
Соответственно, класс Farm далее не будет ничего знать о конкретных типах животных. Осталость добавить простую реализацию для IAnimalFactory.

И в классе Farm просто надо будет заменить:
C#
1
2
3
_animals.Add(new Goose(0, 2, registrationNumber));
// на
_animals.Add(animalFactory.CreateExoticGoose(0, 2, registrationNumber));
0
7 / 0 / 0
Регистрация: 18.05.2018
Сообщений: 158
19.02.2022, 16:39  [ТС]
Спасибо за ответ. Сделал через фабрику,но препод все равно отклонил задание: речь о том, чтобы внутри классов Farm и Stable не было упоминания животных, фабрика не решает данного вопроса. Добавление животных на ферму должно вызываться, например, из метода Main, т.е. не из самой фермы, а извне.

Тут я уже не понял. Как можно добавлять животных на ферму без упоминания животных.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
class Program
    {
        static void Main(string[] args)
        {
            Farm farm = new Farm();
 
            farm.Work();
        }
    }
 
    class Farm
    {
        private string[] _weekDay = { "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье" };
        private Stable _stable = new Stable(new AnimalFactory());
 
        private void CollectProduct()
        {
            for (int i = 0; i < _weekDay.Length; i++)
            {
                Console.WriteLine(_weekDay[i]);
                _stable.CollectProduct();
            }
        }
 
        public void Work()
        {
            _stable.Initialize();
            _stable.Information();
 
            CollectProduct();
 
            Console.WriteLine(_stable.GetAllAmountProducts());
 
            _stable.AddNewAnimals();
            _stable.Information();
 
            CollectProduct();
 
            Console.WriteLine(_stable.GetAllAmountProducts());
        }
    }
 
    class Stable
    {
        private AnimalFactory _animalFactory;
 
        private List<Product> _products = new List<Product>();
        private List<Animal> _animals = new List<Animal>();
 
        private int _template = 1;
 
        public Stable(AnimalFactory animalFactory)
        {
            _animalFactory = animalFactory;
        }
 
        public void CollectProduct()
        {
            Random random = new Random();
            var animal = _animals[random.Next(0, _animals.Count)];
            int product = animal.GetProduct();
 
            Console.WriteLine($"Собрано {product} продукта у животного под регистрационным номером {animal.RegistrationNumber}");
 
            _products.Add(new Product(animal, product));
        }
 
        public void Initialize()
        {
            int registrationNumber;
 
            int animalsAmount = 30;
 
            for (int i = 0; i < animalsAmount; i++)
            {
                registrationNumber = _template;
 
                if (i < 9)
                    _animals.Add(_animalFactory.CreateCow(registrationNumber));
                else
                    _animals.Add(_animalFactory.CreateChicken(registrationNumber));
 
                _template++;
            }
        }
 
        public void Information()
        {
            for (int i = 0; i < _animals.Count; i++)
            {
                _animals[i].Information();
            }
        }
 
        public int GetAllAmountProducts()
        {
            int allAmount = 0;
 
            for (int i = 0; i < _products.Count; i++)
            {
                allAmount += _products[i].Amount;
            }
 
            return allAmount;
        }
 
        public void AddNewAnimals()
        {
            int animalsAmount = 6;
 
            for (int i = 0; i < animalsAmount; i++)
            {
                if (i < 1)
                    _animals.Add(_animalFactory.CreateCow(_template));
                else
                    _animals.Add(_animalFactory.CreateChicken(_template));
 
                _template++;
            }
        }
    }
 
    class Product
    {
        private Animal _animal;
        private int _amount;
 
        public int Amount => _amount;
 
        public Product(Animal animal,int amount)
        {
            _animal = animal;
            _amount = amount;
        }
        
        public void Information()
        {
            Console.WriteLine($"Количество продукта {_amount} у животного в регистрационным номером {_animal.RegistrationNumber}");
        }
    }
 
    class Chicken : Animal
    {
        public Chicken(int registrationNumber) : base(registrationNumber) { }
 
        public override int GetProduct()
        {
            Random random = new Random();
            int productAmount = 0;
 
            productAmount = random.Next(0, 2);
 
            return productAmount;
        }
    }
 
    class Cow : Animal
    {
        public Cow(int registrationNumber) : base(registrationNumber) { }
 
        public override int GetProduct()
        {
            Random random = new Random();
            int productAmount = 0;
 
            productAmount = random.Next(8, 12);
 
            return productAmount;
        }
    }
 
    abstract class Animal
    {
        private int _registrationNumber;
 
        public int RegistrationNumber => _registrationNumber;
 
        public Animal(int registrationNumber)
        {
            _registrationNumber = registrationNumber;
        }
 
        public abstract int GetProduct();
 
        public void Information()
        {
            Console.WriteLine($"{GetType().Name} - регистрационный номер {_registrationNumber}");
        }
    }
 
    class AnimalFactory : IAnimalFactory
    {
        public Animal CreateChicken(int registrationNumber)
        {
            return new Chicken(registrationNumber);
        }
 
        public Animal CreateCow(int registrationNumber)
        {
            return new Cow(registrationNumber);
        }
    }
 
    interface IAnimalFactory
    {
        public Animal CreateCow(int registrationNumber);
 
        public Animal CreateChicken(int registrationNumber);
    }
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
19.02.2022, 17:38
Цитата Сообщение от roma1808 Посмотреть сообщение
Добавление животных на ферму должно вызываться, например, из метода Main, т.е. не из самой фермы, а извне.
Согласен, это имеет смысл. Код, который будет пользоваться вашей фабрикой, должен знать, какие конкретно животные ему нужно будет добавлять на ферму.
Тогда просто создайте одноименные метод AddAnimals(IEnumerable<Animal> animals) в классы Farm, Stable.
И вызывайте, когда нужно. Фабрику можно удалить.

PS: непонятно, в чем смысл класса Stable - его название ни о чем не говорит. Первая мысль, что приходит в голову - эта та часть фермы, которую не стыдно показать инвестору, где все животные дружно живут, и сами добровольно лезут под нож, по-расписанию. Так сказать, понимают свою роль.
А есть нестабильная часть фермы - где куры дохнут пачками, если их забыли покармить (тут такое случается). Так что-ли? Наверное, имеет смысл удалить класс Stable и весь код оформить внутри одного класса Farm.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.02.2022, 17:38
Помогаю со студенческими работами здесь

Написать программу которая будет требовать пароль до тех пор пока он не будет введен верно
Написать программу которая будет требовать пароль до тех пор пока он не будет введен верно.

Как ведет себя mysql при добавление новых данных?
Мне необходимо хранить в mysql точную последовательность данных. Например есть у меня список из цифр 6 -&gt; 2 -&gt; 3 -&gt; 5 -&gt; 4...

Как реализовать добавление новых тегов div на asp.net страницу по нажатию кнопки "Добавить"
Здравствуйте. Подскажите как реализовать добавление новых тегов div на asp.net страницу по нажатию кнопки &quot;Добавить&quot;. Нужно...

Как реализовать классы животных?
Добрый день! Создала 2 класса животных: class big_an : #Коровы, козы, овцы, свиньи; size = &quot;big&quot; paws =...

Как реализовать паттерн Хранитель при использовании ссылочных типов
Каким образом можно использовать паттерн &quot;хранитель&quot; при хранении ссылочных типов? Т.е. состояние изменяется несколько раз и необходимо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа в КА2. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru