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

Индексаторы для разных членов класса

04.01.2020, 16:36. Показов 1367. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. У меня есть некоторый класс(назовём его class A), в котором определены два поля массива, которые, в свою очередь, так же являются классами. В 1й закомментированной строке определяю индексатор для одного поля, а когда тоже самое делаю для второго поля, то пишет, что "тип А уже определяет член this с такими же типами параметров". НО несмотря на то, что закомментированно две строки, программа номрально выводит эти массивы. ВОПРОСы. Зачем нужны тогда индексаторы, почему не могу определить для двух полей разных типов? и
не достаточно ли свойств?
Объясните пожалуйста, буду очень благодарен.

C#
1
2
3
4
 //public ECar this[int index] { get { return car[index]; } set { car[index] = value; } }
        //public EBuilding this[int index] { get { return building[index]; } set { building[index] = value; } }
        public ECar[] Car { get { return car; } set { car = value; } }
        public EBuilding[] Building { get { return building; } set { building = value; } }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.01.2020, 16:36
Ответы с готовыми решениями:

Операции класса, индексаторы Rectangle
Здравствуйте. Пожалуйста помогите решить задачу. Задание: В класс Rectangle добавить: а. Индексатор, позволяющий по индексу 0...

Определение пользовательских методов класса. Массивы. Индексаторы.
О_о Задание : Создайте проект, в котором опишите класс для решения задачи Вашего варианта. Каждый разрабатываемый класс должен...

Задачка для новичков #2: вывести в методе класса-родителя значение данных-членов из дочернего класса
Вдохновленный соседней темой тоже решил задать свой вопрос таким же начинающим программистам как и я :) Все кто хочет попробовать дать...

6
 Аватар для Enifan
1848 / 1190 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
04.01.2020, 16:43
YFKoenigsegg, Когда вы будете обращаться к классу через индексатор - компилятор как будет догадываться какую именно перегрузку индексатору ему использовать? У вас сигнатура одинаковая. Потому и ошибка. Это все равно что перегрузить один и тот же метод с одинаковой сигнатурой и будет ошибка
C#
1
2
    void Foo(int a) { }
    void Foo(int b) { }
0
1 / 1 / 0
Регистрация: 06.10.2018
Сообщений: 161
04.01.2020, 18:23  [ТС]
То есть, для моего класса A (для класса A в целом) всего навсего необходима одна реализация индексатора(я делаю для типа int), а не для каждого поля отдельно, которые являются массивами в самом классе А(class ECar, class EBuilding)?

Добавлено через 5 минут
Вот мой класс, в котором хочу написать индексаторы как для ECar, так и для EBuilding
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    class A
    {
        ECar[] car;
        EBuilding[] building;
        public A(EBuilding[] buildg, ECar[] cars)
        {
            car = cars;
            building = buildg;
        }
        //??
        //public ECar this[int index] { get { return car[index]; } set { car[index] = value; } }
        //public EBuilding this[int index] { get { return building[index]; } set { building[index] = value; } }
        public ECar[] Car { get { return car; } set { car = value; } }
        public EBuilding[] Building { get { return building; } set { building = value; } }
 
    }
Добавлено через 15 минут
Не могу понять: не написал ни одного индексатора, а спокойно пользуюсь for и foreach для установки и для получения значения. Пользуюсь только одними свойствами.
0
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
04.01.2020, 18:29
Немного не понял, но если вы хотите два индексатора с разными именами, то они у вас уже практически есть - это ваши массивы.
Например ваш класс таков
C#
1
2
3
4
5
6
7
8
9
10
11
class A
{
    public ECar[] Car;
    public EBuilding[] Building;
    public A(EBuilding[] buildg, ECar[] cars)
    {
        Car = cars;
        Building = buildg;
    }
 
}
Тогда после создания экземпляра этого класса, просто обращаетесь к нужным массивам и их индексам, например

C#
1
2
3
4
5
6
7
8
A a = new A(передаём параметры);
 
a.Car[2] = new ECar();
 
for (int i = 0; i < a.Building.Length; i++)
{
    a.Building[i] = new EBuilding();
}
0
 Аватар для Enifan
1848 / 1190 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
04.01.2020, 19:04
Цитата Сообщение от YFKoenigsegg Посмотреть сообщение
написать индексаторы как для ECar, так и для EBuilding
С одинаковой сигнатурой увы нельзя так делать, можно сделать перегрузку индексаторов, но наврятли это вам поможет.
Можно сделать костыли - хотя не рекомендую, сделать типы например int и double.
Поймите, индексаторы - это сокращенная запись для обращения к какому нибудь массиву, который например скрыт.
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
using System;
 
class A
{
    public int[] IntArr { get; private set; }
    public char[] CharArr { get; private set; }
 
    public A()
    {
        IntArr = new int[] { 0, 1, 2, 3, 4};
        CharArr = new char[] { 'a', 'b', 'c', 'd', 'e' };
    }
 
    public int this[int index]
    {
        get
        {
            return IntArr[index];
        }
        set
        {
            IntArr[index] = value;
        }
    }
 
    public char this[char ch]
    {
        get
        {
            return CharArr[ch - 'a'];
        }
        set
        {
            CharArr[ch - 'a'] = value;
        }
    }
}
 
class Test
{
    static void Main()
    {
        A a = new A();
 
        int i = 0;
        char ch = 'a';
 
        for (; i < 5; i++, ch++)
        {
            Console.WriteLine(a[i] + " " + a[ch]);
        }
 
        Console.ReadKey();
    }
}
1
1 / 1 / 0
Регистрация: 06.10.2018
Сообщений: 161
04.01.2020, 19:10  [ТС]
Спасибо. Дело в том, что я в примерах видел как всё равно пишут индексатор, хоть там поле, как и у меня, тоже массив.
Почему вы сказали "практически готовы"?
0
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
04.01.2020, 19:27
Цитата Сообщение от YFKoenigsegg Посмотреть сообщение
Почему вы сказали "практически готовы"?
Потому что это не совсем те индексаторы, которые вы хотели получить, а простое обращение к массивам внутри класса.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.01.2020, 19:27
Помогаю со студенческими работами здесь

Организовать динамическое выделение памяти в конструкторе класса для соответствующих данных-членов
Мне нужно, чтобы под элементы отводилась динамическая память, но я не знаю, как это можно реализовать. #include &lt;iostream&gt;...

Создать универсальный вектор для разных типов класса
Нужно создать абстрактный класс, в котором будет метод Add(), типа вектор, но этот метод должен использоваться в трех классах наследниках,...

Создать экземпляр класса без явного указания членов класса
Если у меня есть два конструктора, один из которых по умолчанию, а второй явный. Я почему-то не могу создать экземпляр класса без явного...

Перегрузка оператора для разных типов данных шаблонного класса
Создаю оператор инкремента. Как создать отдельный оператор инкремента для каждого типа объекта класса? Если допустим у меня будут несколько...

Создать класс CheckerBoard (особенности строения класса - инициализация константных членов класса)
Вот код: #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; const int xSize = 1; const int ySize = 1; class...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru