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

Как обратиться из конструктора базового абстрактного класса к свойству-массиву класса наследника

04.03.2018, 23:02. Показов 4012. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Подскажите как обратиться из конструктора базового абстрактного класса к свойству-массиву из класса наследника.
Вроде бы побычный downcast, но что-то не нравиться, почему-то возвращает int вместо string, пишет:
Cannot implicitly convert type "int" to "string".
Цель: Есть абстрактный класс Сharacter, есть класс наследник Enemy : Сharacter,
при создании екземпляра класса Enemy, должен вызываться конструктор базового класса, а тот в свою очередь, должен обращаться к статическому свойству класса наследника, содердащего массив с именами, и автоматически присваивать случайное имя.
Помогите оформить код корректно, может чего не так делаю.
Подскажите правильное решение, только не как проще, а как нужно, так как сделать поще могу сам, хочу обрести понимание правильно ли вообще такой downcast делать и как делать его правильно или вообще без него нужно.

Заранее спасибо.
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
 abstract class Character
{
    Random rnd = new Random();
    public string Name { get; set; }
 
         public Character()
        {
            Name = rnd.Next(0,Enemy.EnemyFirstNames.Length);
        }
}
 
 class Enemy : Character
    {
        public static string[] EnemyFirstNames
        {
            get { return EnemyFirstNames[]; }
            set { EnemyFirstNames = value; }
        }
 
        public Enemy()
        {
            EnemyFirstNames = new string[] { "Серега", "Димон", "Костян", "Некит", "Саня" };
        }                       
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.03.2018, 23:02
Ответы с готовыми решениями:

Вызов конструктора базового класса из класса-наследника
Можно ли вне списка инициализации вызвать конструктор базового класса ? class A { int a; public: A(int c):a(c){} ...

Вызов конструктора абстрактного базового класса
Здравствуйте, в классе вызываю с помощью super() конструктор абстрактного базового класса -...

Как сделать явное приведения переменной типа класса-наследника к типу базового класса?
Читал, что для этого нужно явное приведение к типу, но на практике выдаёт ошибку. Вот код: using System; using System.Linq; namespace...

5
5 / 4 / 2
Регистрация: 03.03.2018
Сообщений: 19
04.03.2018, 23:21
Лучший ответ Сообщение было отмечено Alone11 как решение

Решение

Name = rnd.Next(0,Enemy.EnemyFirstNames.Length); - у вас здесь рандомится int'овое число
чтобы рандомилось имя из массива нужно писать:
C#
1
Name = EnemyFirstNames[rnd.Next(0,Enemy.EnemyFirstNames.Length)];
0
26 / 24 / 17
Регистрация: 10.01.2018
Сообщений: 66
04.03.2018, 23:32
Вообще, очень странно и непонятно.
У вас объект Enemy хранит список всех возможных имен. Нелогично, как по мне.
Можно создать дополнительный клас, который будет хранить имена.

Добавлено через 3 минуты
И еще вы жестко связали базовый клас и наследника.
Если вы создадите еще один клас наследника, что тогда?

Добавлено через 3 минуты
И зачем инициализировать статическое поле в нестатическом конструкторе?
1
4 / 4 / 0
Регистрация: 14.10.2017
Сообщений: 85
05.03.2018, 00:22  [ТС]
Di_Romero , огромное спасибо за ответ. Буду знать как это делается.

KIKO KUTS , Да наверное стоит создать отдельный класс для хранения имен.

И еще вы жестко связали базовый клас и наследника.
Если вы создадите еще один клас наследника, что тогда?

От класса Enemy не планировал делать наследника, идея в том, что от от базового класса Character идет распаралеленное наследование Hero: Character и Enemy : Character. При сосздании экземпляра класса вызывается один из базовых конструкторов класса, если коснструктор по умолчанию то это враг, и поле name заполняется именами автоматически, если Hero то передается значение.

И зачем инициализировать статическое поле в нестатическом конструкторе?
Подскажите как лучше, что не так с кодом, для чего именно нужно статическое поле именно в статическом конструкторе инициализировать, разве статический конструктор не выполняется один раз при создании экзепляра класса, и только после этого выполнение предается на другие конструкторы?

ps.
Опыта нет, учу C#, готовлюсь к собеседованиям, шишок еще не на бил, для тренировки делаю свою игрушку. Прошу обяснить как лучше и почему.
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
05.03.2018, 00:59
ответь на вопрос, не нам всем, а себе, чем отличаются
Цитата Сообщение от Alone11 Посмотреть сообщение
Hero: Character
и
Цитата Сообщение от Alone11 Посмотреть сообщение
Enemy : Character
не с логики игры, там понятно, 2 лагеря, а с точки зрения ООП?
ничем, ну так штампуй героев, для юзера с введенным именем и в один "массив", для "врага" с рандомным и в другой...
или я что-то не так понял?
0
26 / 24 / 17
Регистрация: 10.01.2018
Сообщений: 66
05.03.2018, 16:56
Лучший ответ Сообщение было отмечено Alone11 как решение

Решение

Статический коструктор нужен для того, чтобы инициализировать статические поля. Такое его назначение.
К статическому полю вы можете обратиться, не создавая экземпляра.
А вы попробуйте обратиться к EnemyFirstNames перед созданием объекта Enemy. Ничего не сработает
Вы правы, статический коструктор отрабатывает только один раз. А нам это и нужно. Зачем переприсваиваивать переменной
EnemyFirstNames одно и тоже значение каждый раз, когда создаем новый объект? Разве в этом есть смысл?

Про наследование:
Я говорил про наследование от класа Character. Дело в том, что он связан с классом Enemy.
Вызывать разные конструкторы в заввисимости от того, кто наследник? Это глупо, извините)

Базововому класу не нужно знать о его потомках как минимум потому, что при добавлении нового потомка нужно будет менять и базовый клас.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    abstract class Character
    {
        public Character(string name)
        {
            this.name = name;
        }
 
        private string name;
 
        public string Name
        {
            get => this.name;
        }
    }
Наследники просто передают параметры базовому, только разные.
Насколько я понял, герою мы передаем имя (наверное, игрок вводит?), соответственно у него есть конструктор с одним параметром.
C#
1
2
3
4
    class Hero : Character
    {
        public Hero(string name) : base(name) { }
    }
C#
1
2
3
4
    class Enemy : Character
    {
        public Enemy() : base(NamesGenerator.GenerateEnemyName()) { }
    }
Класс энеми просит у генератора придумать новое имя. Когда вас рождали, не вы же имя себе придумывали. Здесь точно так же, распределим ответственность. Не нужно лепить все в один класс.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    static class NamesGenerator
    {
        static NamesGenerator()
        {
            names = new string[] { "Serega", "Dimon", "Kostian", "Nekit", "Sania" };
            random = new Random();
        }
 
        private static string[] names;
        private static Random random;
 
        public static string GenerateEnemyName()
        {
            return names[random.Next(0, names.Length)];
        }
    }
В итоге вы имеете 4 файла с классами, которые очень маленькие и простые.
Ну и метод мейн приложу, который можно попробовать:
C#
1
2
3
4
5
6
7
8
9
10
        static void Main(string[] args)
        {
            Character[] characters = new Character[] 
                { new Hero("Hero Vasia"), new Enemy(), new Enemy(), new Enemy() };
 
            foreach (Character character in characters)
                Console.WriteLine(character.Name);
 
            Console.ReadKey();
        }
P.S. Вышесказанное является моей точкой зрения и я не могу быть уверен, что данный вариант идеальный.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.03.2018, 16:56
Помогаю со студенческими работами здесь

Как обратиться к свойству класса из метода этого же класса
Добрый день! function Tta_component.check: boolean; //âåðíåò true åñëè ïðè èíèöèàëèçàöèè áûëà äîïóùåíà îøèáêà var temp_result:...

Создание экземпляра класса-наследника для переменной с типом базового класса
Подскажите чайнику как создается экземпляр класса BC BaseClass BC = new DerivedClass(); Вопрос: BC - это экземпляр класса BaseClass...

Вызов переопределенного метода класса наследника из базового класса
Предположим есть два класа: public class A { /* ... некая дополнительная реализация.... */ ...

Поместить в динамически расширяемый массив объекты класса, производные от базового абстрактного класса
Помогите пожалуйста новичку! (мне). Я хочу создать динамически расширяющийся массив указателей на базовый абстрактный класс,...

Как достучатся до полей и методов наследника абстрактного класса?
Начал писать игру "бомбермен". Создал абстрактный класс Ячейка (abstract class Cell). От ячейки отнаследовал классы. class...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru