Переопределение индексаторов и использование методов в C#

#c# #class #methods #indexer

#c# #класс #методы #индексатор

Вопрос:

У меня есть сезон занятий и эпизод занятий. Класс Season наследует класс Episode. В моем эпизоде с классом есть этот метод:

         public void AddView(double rating)
    {
        viewerCount  ;
        ratingSum  = rating;
        if (rating > this.largestRating)
            this.largestRating = rating;
    }
 

В моем сезоне занятий есть список эпизодов:

 public Episode[] episodes { get; private set; }
 

Я переопределил индексатор класса Season, чтобы он возвращал индексированный эпизод в списке:

         public object this[int i]
    {
        get { return episodes[i]; }
    }
 

Поэтому, когда я делаю это в программе:

         Console.WriteLine(season[5]);
        Console.WriteLine(episodes[5]);
 

Я получаю тот же результат.
Между тем, когда я пытаюсь вызвать методы в этих эпизодах, episodes[5] позволяет мне вызывать функцию addView, но season[5] не позволяет мне.

 Severity    Code    Description Project File    Line    Suppression State
Error   CS1061  'object' does not contain a definition for 'AddView' and no accessible extension 
method 'AddView' accepting a first argument of type 'object' could be found (are you missing a using 
directive or an assembly reference?)    OOP-DZ2 C:UserspatrisourcereposOOP-DZ2OOP- 
DZ2Program.cs  22  Active
 

Как я могу переопределить индексатор, чтобы я мог получить доступ к своему списку объектов эпизодов внутри объекта Season и вызывать для него методы?

РЕШАЕМАЯ ПРОБЛЕМА: мой индексатор был переопределен ошибочно, он вернул объект вместо эпизода класса. Спасибо.

Комментарии:

1. Ваш индексатор возвращает объект Episode , я полагаю, он должен вернуться?

2. Я думаю, вы пытаетесь получить объектный сезон и эпизод с одним и тем же индексатором, верно?

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

Ответ №1:

Ваш класс Season не должен быть базовым классом Episode, а просто контейнером. На самом деле, вы говорите « Class Season inherits class Episode «, что для меня не имеет смысла, а позже вы правильно заявляете, что « My class Season has a list of episodes «.

Я переопределил индексатор класса Season, чтобы он возвращал индексированный эпизод в списке:

 public object this[int i]
{
    get { return episodes[i]; }
}
 

Операторы не переопределяются. Вы перегружаете их обычное поведение, чтобы адаптировать их к вашему классу, но они не переопределяются в смысле C #, переписывая их в производный класс. Возможно, из-за этой путаницы вы вернули object вместо правильного класса Episode .

 public Episode this[int i]
{
    get { return episodes[i]; }
}
 

Между тем, когда я пытаюсь вызвать методы в этих эпизодах, episodes[5] позволяет мне вызывать функцию AddView , но season [5] не позволяет мне.

Это обычное поведение. Я предполагаю, что episodes[5] — это массив объектов класса Episode, в то время Season[5] как просто возвращает объект.

 class Episode {
}

class Season {
    public Episode this[int i]
    {
        get { return episodes[i]; }
    }

    List<Episode> episodes;
}