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

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

04.03.2018, 23:02. Показов 4014. Ответов 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
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 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 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru