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

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

04.03.2018, 23:02. Показов 4063. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru