0 / 0 / 0
Регистрация: 20.07.2019
Сообщений: 10

Как сделать иерархию классов?

17.01.2020, 13:07. Показов 2813. Ответов 9

Студворк — интернет-сервис помощи студентам
А если быть точным. Как сделать иерархию классов так, чтобы к ним можно было обращаться как с общими. Сейчас поясню.
Например, у нас есть такая иерархия: Враг -> Слизень. У класса Врага есть свойство Имя, а у класса Слизень, который наследуется от класса Враг, есть и свойство Имя, и свойство Здоровья. Так же есть отдельный класс Война с методом Битва. В метод Битва передаётся тип Враг, но у класса Враг нет свойства Здоровья. В этом и заключается мой вопрос. Как создать иерархию так, чтобы с экземплярами можно было обращаться как с общими?
Желательно без костылей и подробно, зарание спасибо.

Вот код:
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
class War
    {
        public void Battle(Enemy e)
        {
            Console.WriteLine(e.Name); // Нет ошибки 
            Console.WriteLine(e.HP);   // Есть ошибка
        }
    }
 
    class Enemy
    {
        public string Name { get; set; }
 
        public Enemy(string name)
        {
            Name = name;
        }
    }
 
    class Slug : Enemy
    {
        public int HP { get; set; }
 
        public Slug(string name, int hp) : base(name)
        {
            HP = hp;
        }
    }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.01.2020, 13:07
Ответы с готовыми решениями:

Как лучше построить иерархию классов
Добрый день, пишу программу на курсовую, тема работы компьютер(строитель компьютера). И сомневаюсь, как построить иерархию классов. Сначала...

Разработать иерархию классов
Здравствуйте я новичок, на форуме искал нечего подходящего для моего уровня знаний не нашел. Задание: Далее проводится список...

Расширить иерархию классов
Такая проблема, задание В ЛР: Построить иерархию классов в соответствии с вариантом задания: 11) Автомобиль, поезд, транспортное...

9
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
17.01.2020, 13:08
Цитата Сообщение от Fantoner Посмотреть сообщение
Как создать иерархию так, чтобы с экземплярами можно было обращаться как с общими?
Кастовать к родительскому классу ?
0
0 / 0 / 0
Регистрация: 20.07.2019
Сообщений: 10
17.01.2020, 13:11  [ТС]
Цитата Сообщение от Почтальон Посмотреть сообщение
Кастовать к родительскому классу ?
Тоже думал об этом, но не могу реализовать. Не могли бы привести пример на основе моего кода?
0
Фрилансер
 Аватар для FateOri
761 / 458 / 146
Регистрация: 06.01.2017
Сообщений: 4,856
17.01.2020, 13:11
Цитата Сообщение от Fantoner Посмотреть сообщение
А если быть точным. Как сделать иерархию классов так, чтобы к ним можно было обращаться как с общими. Сейчас поясню.
никак нельзя))

сами подумайте - все слизни враги но не все враги слизни

выносите здоровье в базовый класс
0
0 / 0 / 0
Регистрация: 20.07.2019
Сообщений: 10
17.01.2020, 13:13  [ТС]
Если у меня будет даже 10 врагов, у которых в свою очередь будет свои особенности, родительский класс будет сильно перегружен. Это точно не вариант
0
Фрилансер
 Аватар для FateOri
761 / 458 / 146
Регистрация: 06.01.2017
Сообщений: 4,856
17.01.2020, 13:16
Цитата Сообщение от Fantoner Посмотреть сообщение
Если у меня будет даже 10 врагов родительский класс будет сильно перегружен. Это точно не вариант
при правильной архитектуре не будет

Добавлено через 1 минуту
Цитата Сообщение от Почтальон Посмотреть сообщение
Кастовать к родительскому классу ?
та вы не поняли он хочет наоборот от родительского кастануть к дочернему но так нельзя
1
0 / 0 / 0
Регистрация: 20.07.2019
Сообщений: 10
17.01.2020, 13:18  [ТС]
Цитата Сообщение от Почтальон Посмотреть сообщение
Сообщение от Fantoner
Как создать иерархию так, чтобы с экземплярами можно было обращаться как с общими?
Кастовать к родительскому классу ?
Цитата Сообщение от FateOri Посмотреть сообщение
та вы не поняли он хочет наоборот от родительского кастануть к дочернему но так нельзя
Не, наоборот. Создаю экземпляр класса Слизень и передаю его в Битву, но когда его передаю у него пропадают свойства Слизня
0
Фрилансер
 Аватар для FateOri
761 / 458 / 146
Регистрация: 06.01.2017
Сообщений: 4,856
17.01.2020, 13:20
Цитата Сообщение от Fantoner Посмотреть сообщение
Не, наоборот. Создаю экземпляр класса Слизень и передаю его в Битву, но когда его передаю у него пропадают свойства Слизня
так и должно быть
читайте что я вам пишу))
0
 Аватар для Toros1992
899 / 554 / 275
Регистрация: 26.11.2015
Сообщений: 1,758
Записей в блоге: 2
17.01.2020, 13:28
У вас абстракции неверно выстроены. у всех врагов должно быть здоровье. Ведь у всех, кто учавствует в битве должно оно быть. Поэтому именно здоровье должно быть в Enemy. А вот какой-нибудь коэффицент, влияющий на то, как это здоровье отнимается - должен быть в наследниках
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
18.01.2020, 14:59
Fantoner, в данном случае, вы неверно подошли к реализации.
Вам лучше сделать как посоветовал Toros1992.

В общем же случае, надо работать не через классы (вернее не только через них), а через интерфейсы.

Пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    class War
    {
        public void Battle(Enemy e)
        {
            Console.WriteLine(e.Name); // Нет ошибки 
            if (e is IHP eHP)
                Console.WriteLine(eHP.HP);   // Есть ошибка
        }
        public void Battle(Friend f)
        {
            Console.WriteLine(f.Name); // Нет ошибки 
            if (f is IHP fHP)
                Console.WriteLine(fHP.HP);   // Есть ошибка
        }
    }
C#
1
2
3
4
    public interface IHP
    {
        int HP { get; set; }
    }
C#
1
2
3
4
5
6
7
8
9
    class Enemy
    {
        public string Name { get; set; }
 
        public Enemy(string name)
        {
            Name = name;
        }
    }
C#
1
2
3
4
5
6
7
8
9
    class Slug : Enemy, IHP
    {
        public int HP { get; set; }
 
        public Slug(string name, int hp) : base(name)
        {
            HP = hp;
        }
    }
C#
1
2
3
4
5
6
7
8
9
    class Friend
    {
        public string Name { get; set; }
 
        public Friend(string name)
        {
            Name = name;
        }
    }
C#
1
2
3
4
5
6
7
8
9
    class Strawberry : Friend, IHP
    {
        public int HP { get; set; }
 
        public Strawberry(string name, int hp) : base(name)
        {
            HP = hp;
        }
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.01.2020, 14:59
Помогаю со студенческими работами здесь

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

Реализовать иерархию классов
Реализовать иерархию классов Фигура - Треугольник – Прямоугольник (данные-координаты). Определить и использовать интерфейс IFigure...

Построить иерархию классов
1 задание. Построить иерархию классов: Деталь, механизм, изделие, узел. 2 задание. Расширить иерархию классов из Задания 1 с...

Организовать иерархию классов
Организовать иерархию классов, в которых предусмотреть закрытые поля с соответствующими свойствами, а также написать программный код двух...

Построить иерархию классов
1. Построить иерархию классов 2. Характеристики и методы классов разработать самостоятельно. 3. Использовать абстрактные классы, там...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru