Indeksery (this[])
Część sekcji Programowanie obiektowe ścieżki C# w Coddy. Lekcja 37 z 70.
Indeksery pozwalają uzyskiwać dostęp do elementów klasy za pomocą nawiasów kwadratowych, podobnie jak w przypadku tablicy. Zamiast wywoływać metodę, taką jak collection.GetItem(0), możesz napisać bardziej intuicyjne collection[0].
Definiujesz indeksator za pomocą słowa kluczowego this i nawiasów kwadratowych:
public class Sentence
{
private string[] words;
public Sentence(string text)
{
words = text.Split(' ');
}
public string this[int index]
{
get { return words[index]; }
set { words[index] = value; }
}
}Teraz możesz uzyskiwać dostęp do słów w naturalny sposób:
Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]); // Hello
s[1] = "C#";
Console.WriteLine(s[1]); // C#Indeksery nie są ograniczone do liczb całkowitych. Jako parametru indeksu możesz użyć dowolnego typu, dzięki czemu przydają się do dostępu podobnego do dostępu do słownika:
public string this[string key]
{
get { return dictionary[key]; }
set { dictionary[key] = value; }
}Podobnie jak właściwości, indeksatory mogą być tylko do odczytu (bez settera) lub zawierać logikę walidacji w swoich akcesorach. Sprawdzają się idealnie, gdy klasa opakowuje kolekcję lub gdy notacja nawiasowa zwiększa czytelność kodu.
Wyzwanie
ŁatwyZbudujmy klasę Playlist, która pozwala uzyskiwać dostęp do utworów za pomocą intuicyjnej notacji nawiasowej, podobnie jak w przypadku pracy z tablicą. Utworzysz playlistę, w której utwory można pobierać i aktualizować na podstawie ich pozycji za pomocą indeksatora.
Rozmieścisz swój kod w dwóch plikach:
Playlist.cs: Utwórz klasęPlaylistw przestrzeni nazwMusic, która opakowuje wewnętrzny zbiór utworów i zapewnia dostęp podobny do tablicy za pomocą indeksatora. Twoja playlista powinna mieć:- Prywatną tablicę ciągów znaków do przechowywania tytułów utworów
- Konstruktor, który przyjmuje ciąg tytułów utworów rozdzielonych przecinkami i dzieli go na wewnętrzną tablicę
- Indeksator używający składni
this[int index], który umożliwia zarówno pobieranie, jak i ustawianie utworów na określonej pozycji - Właściwość tylko do odczytu
Count, która zwraca liczbę utworów na playliście - Metodę
GetAllSongs(), która zwraca wszystkie utwory połączone za pomocą" | "
Program.cs: W pliku głównym utwórz playlistę na podstawie danych wejściowych, a następnie użyj indeksatora, aby uzyskać dostęp do utworów i je zmodyfikować. Zademonstruj zarówno odczytywanie utworów według indeksu, jak i aktualizowanie utworu na określonej pozycji.
Otrzymasz trzy dane wejściowe:
- Listę tytułów utworów rozdzielonych przecinkami (np.
Song A,Song B,Song C) - Indeks utworu do pobrania (liczba całkowita)
- Nowy tytuł utworu, który zastąpi utwór o tym samym indeksie
Wyświetl wynik w tym formacie:
Total songs: {Count}
Song at index {index}: {song title}
After update: {GetAllSongs()}Na przykład, jeśli danymi wejściowymi są Rock Anthem,Jazz Vibes,Pop Hit, 1 i Blues Classic, wynikiem powinno być:
Total songs: 3
Song at index 1: Jazz Vibes
After update: Rock Anthem | Blues Classic | Pop HitZauważ, że indeksator pozwala uzyskać dostęp do playlist[1], aby pobrać "Jazz Vibes", a następnie przypisać playlist[1] = "Blues Classic", aby zaktualizować utwór — to znacznie bardziej naturalne niż wywoływanie metod takich jak GetSongAt(1) lub SetSongAt(1, "Blues Classic")!
Spróbuj swoich sił
using System;
using Music;
class Program
{
public static void Main(string[] args)
{
// Odczytaj dane wejściowe
string songList = Console.ReadLine();
int index = Convert.ToInt32(Console.ReadLine());
string newSong = Console.ReadLine();
// TODO: Utwórz obiekt Playlist na podstawie songList
// TODO: Wypisz łączną liczbę utworów, używając właściwości Count
// TODO: Wypisz utwór o podanym indeksie, używając indeksera
// TODO: Zaktualizuj utwór o podanym indeksie, używając indeksera
// TODO: Wypisz wszystkie utwory po aktualizacji, używając GetAllSongs()
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrznePrzestrzenie nazw i dyrektywyWprowadzenie do klas i obiektówSłowo kluczowe „this”Metody i parametryPola a właściwościKonstruktoryInicjalizatory obiektówPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawowa składnia dziedziczenia (:)Słowo kluczowe 'base'Słowa kluczowe virtual i overrideKlasy sealedBazowa klasa 'object'Powtórzenie – hierarchia pracowników7Zaawansowane funkcje
Przeciążanie operatorówIndeksery (this[])Nadpisywanie ToString()Metody rozszerzającePodsumowanie – własna lista2Właściwości i składowe statyczne
Właściwości automatyczneWłaściwości tylko do odczytu i zapisuPola i metody statyczneKlasy statyczneSkładowe z ciałem wyrażeniowym5Polimorfizm i interfejsy
Polimorfizm czasu kompilacji a czasu wykonaniaInterfejs a klasa abstrakcyjnaWiele interfejsówJawne implementowanie interfejsówRzutowanie w górę i w dółPowtórka — kalkulator kształtów8Zaawansowane koncepcje OOP
Kompozycja zamiast dziedziczeniaTypy generyczne (klasy i metody)Delegaty i zdarzeniaAtrybuty i refleksjaIDisposable i instrukcja usingPodstawy wstrzykiwania zależności11Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu3Architektura klas
Dane instancji a dane statyczneSłowa kluczowe 'readonly' i 'const'Pola zapasowePowtórzenie — menedżer kont bankowych6Hermetyzacja
Modyfikatory dostępuWłaściwości w hermetyzacjiImplementacja ukrywania danychWzorce niezmiennościPowtórka — dane studentów9Argumenty zmiennej liczby
Słowo kluczowe „params”Parametry opcjonalneArgumenty nazwanePrzeciążanie metodPoćwicz samodzielnie: Kompilator C# online