1 Programowanie Obiektowe – Wykład 8dr Piotr Jastrzębski Wydział Matematyki i Informatyki
2 Tematyka wykładu właściwości indeksatoryenum, tablice, kolekcje – jeszcze raz
3 Filary programowania obiektowegoabstrakcja hermetyzacja dziedziczenie polimorfizm
4 class Osoba { private string imie; private int wiek; public void UstawWiek(int wiek) {this.wiek=wiek;} public int PobierzWiek() { return wiek; } public void UstawImie(string imie) { this.imie = imie; } public string PobierzImie() { return imie; } }
5 Osoba osoba1 = new Osoba(); osoba1. UstawWiek(21); //długo osoba1Osoba osoba1 = new Osoba(); osoba1.UstawWiek(21); //długo osoba1.wiek = 21; //niedostępne
6 Właściwości specjalna konstrukcja języka C# pozwalająca połączyć zachowanie pól i metod wyglądają jak pola więc możemy pobrać ich wartość bądź je przypisać, a jednocześnie zachowują się jak metody czyli możemy stosować je w interfejsach
7 modyfikatorDostepu typ NazwaWłaściwosci { get // kod przy pobraniu wartości } set //kod wywoływany przy nadaniu wartości
8
9 private int wiek; //pole public int Wiek //właściwość { get { return wiek; } set { wiek = value; } } Zwróć uwagę na dwie rzeczy: - nazwa pola (z małej litery) a nazwa właściwości (z dużej) - value – występuję tylko we wnętrzu set
10 Użycie właściwości dla obiektuOsoba osoba1 = new Osoba(); osoba1.Wiek = 21; //set Console.WriteLine(osoba1.Wiek); //get
11 Skrócona deklaracja class Osoba { public int Wiek { get; set; } } class Program static void Main(string[] args) Osoba osoba1 = new Osoba(); osoba1.Wiek = 21; Console.WriteLine(osoba1.Wiek); Console.ReadKey();
12 Właściwość tylko do odczytuprivate int wiek; public int Wiek { get return wiek; }
13 Właściwość tylko do zapisuprivate int wiek; public int Wiek { set wiek = value; }
14 Dobra praktyka wg MSDN ilość kodu/instrukcji umieszczonych we właściwościach powinniśmy ograniczyć do minimum dopuszczalne są jedynie „proste” operacje
15 Dostępność właściwościdomyślne powielany jest modyfikator dostępu właściwości dla get i set, ale można go nadpisać public int Wiek { private get { return wiek; } set { wiek = value; } }
16 Dostępność właściwościnie możemy nadpisać obu jednocześnie (lepiej zmienić modyfikator właściwości) public int Wiek { private get { return wiek; } private set { wiek = value; } }
17 Dostępność właściwościmodyfikatory dla get i set nie mogą być bardziej dostępne niż modyfikator samej właściwości private int Wiek { public get { return wiek; } set { wiek = value; } }
18 Pola czy właściwości – co używać?właściwości nie mogą być użyte przy słowach kluczowych ref i out Osoba osoba1 = new Osoba(); int.TryParse("21", out osoba1.Wiek); właściwości nie mogą być stałymi
19 Interfejsy a właściwościinterface IWiek { int Wiek { get; set; } }
20 Właściwości wirtualne i ich przesłanianieclass Osoba { protected int wiek; public virtual int Wiek get { return wiek; } set { wiek = value; } } class Dwudziestolatek:Osoba public override int Wiek get { return 20; } Podobnie możemy stworzyć właściwości abstrakcyjne w klasie abstrakcyjnej.
21 Inicjowanie obiektu z użyciem właściwościOsoba osoba1 = new Osoba() { Wiek = 22 };
22 Indeksatory zapewniają dostęp do tablic, list, słownikówpodobne do właściwości, ale dostęp odbywa się po argumencie indeksującym int[] liczby = new int[3] { 2, -3, 0 }; Console.WriteLine(liczby[2]); // 0
23 Klasa string ma indeksator dający dostęp do każdej jej wartości char poprzez indeks typu int.string s = "cześć"; Console.WriteLine(s[0]); // 'c' Console.WriteLine(s[3]); // 'ś'
24 class Sentencja { string[] powiedzenie = "Nosił wilk razy kilka"class Sentencja { string[] powiedzenie = "Nosił wilk razy kilka".Split(); public string this[int indeks] // indeksator get { return powiedzenie[indeks]; } set { powiedzenie[indeks] = value; } } static void Main(string[] args) Sentencja s = new Sentencja(); Console.WriteLine(s[1]); // wilk s[1] = "kangur"; Console.WriteLine(s[1]); // kangur Console.ReadKey();
25 C# 6.0 – zwięzła forma, bez set, tylko do odczytuclass Sentencja { string[] powiedzenie = "Nosił wilk razy kilka".Split(); public string this[int indeks] => powiedzenie[indeks]; } static void Main(string[] args) Sentencja s = new Sentencja(); Console.WriteLine(s[1]); // wilk Console.ReadKey();
26 class EdytoryTekstu { private Dictionary
27 EdytoryTekstu edytory = new EdytoryTekstu(); ConsoleEdytoryTekstu edytory = new EdytoryTekstu(); Console.WriteLine(edytory["doc"]); //Word edytory["doc"] = "Libre Office Writer"; Console.WriteLine(edytory["doc"]);
28 Tryb wyliczeniowy - enumDaje możliwość przypisania zestawu wartości, które mogą być przypisane do zmiennej. Przykład – dni tygodnia. Gdybyśmy przechowywali to w typie string istnieje ryzyko wprowadzenie innej wartości. Nie ma co tworzyć „na siłę”, np. by przechowywać numer dni w tygodniu/miesiącu.
29 Tryb wyliczeniowy - enumDeklaracja enum DniTygodnia { Poniedziałek, Wtorek, Środa, Czwartek, Piątek, Sobota, Niedziela }; Domyślnie elementy typu wyliczeniowego są typu int, ale w razie potrzeby możemy zawsze zmienić ten typ na inny całkowitoliczbowy (byte, sbyte, short, ushort, int, uint, long, ulong). enum Miesiące : byte { Sty, Lut, Mar, Kwi, Maj, Cze, Lip, Sie, Wrz, Paź, Lis, Gru };
30 Odwołanie do wyliczeniaJeśli chcemy otrzymać nazwę, to musimy poprzedzić ją nazwą typu wyliczeniowego. DniTygodnia.Poniedziałek; Np. deklaracja zmiennej urodziny typu DniTygodnia wygląda następująco: DniTygodnia urodziny = DniTygodnia.Poniedziałek; Jeśli chcemy otrzymać numer elementu, musimy go zrzutować na typ całkowitoliczbowy (domyślnie int), numeracja domyślnie zaczyna się od zera. int numerDnia = (int)DniTygodnia.Czwartek;
31 Możemy ręcznie nadać wartość poszczególnym składnikom. Np.enum DniTygodnia { Poniedziałek=1, Wtorek, Środa, Czwartek, Piątek, Sobota, Niedziela }; int numerDnia = (int)DniTygodnia.Czwartek; //zmienna numerDnia będzie miała wartość 4
32 Enum pozwala na przypisanie tej samej wartości do tej samej dosłownej wartości. Np..enum DniTygodnia { Poniedziałek, Wtorek=0, Środa, Czwartek, Piątek, Sobota, Niedziela }; DniTygodnia urodziny = DniTygodnia.Wtorek;
33 Kolekcje niegeneryczne (mogą przechowywać różne typy)generyczne (przechowują tylko zadeklarowany typ) Zalety typów generycznych brak konieczności pamiętania o rzutowaniu mniejsze ryzyko błędu czy wyjątku wywołanie niektórych metod nie powoduje ich opakowanie w typ object mniejsza ilość kodu, lepsze czytelność mniejsza ilość zajmowanej pamięci
34 Stos (ang. Stack) Przechowuje dane zgodnie z zasadą LIFO (ang. Last-In, First-Out), co oznacza: ostatni przyszedł, pierwszy wyszedł. Przykład z życia: Stos talerzy (aby wyciągnąć coś ze środka, musimy wyciągnąć te z góry) Meble ładowane do naczepy ciężarówki Osoby wsiadające do samolotu i wysiadające z niego. Piramida czirliderek (osoba na samej górze schodzi pierwsza)
35
36 Dwa typy niegeneryczny (Stack) generyczny (Stack
37 Metody i właściwości Push() – dodanie elementuPop() – usuwa i zwraca ostatni element na stosie Peek() zwraca ostatni element, ale nie usuwa go ze stosu Contains() – sprawdzenie czy element jest na stosie Count – zwraca liczbę elementów na stosie
38 Stack
39 Co z sortowaniem elementów stosu?Stack
40 Kolejki (ang. Queue) Przechowuje dane zgodnie z zasadą FIFO (ang. First-In, First-Out), co oznacza: pierwszy przyszedł, pierwszy wyszedł. Przykład z życia: samochody poruszające się po jednokierunkowej ulicy, ludzie czekający w kolejce, klienci czekający na wsparcie techniczne.
41
42 Dwa typy niegeneryczny (Queue) generyczny (Queue
43 Metody i właściwości Enqueue() – dodanie elementu na końcu kolejkiDequeue() – usuwa i zwraca pierwszy element na kolejce Peek() zwraca pierwszy element, ale nie usuwa go z kolejki Contains() – sprawdzenie czy element jest w kolejce Count – zwraca liczbę elementów w kolejce
44 Queue
45 Różnice między stosem a kolejką
46 Lista tablic (ang. ArrayList)Niegeneryczna kolekcja na przechowywanie tablic obiektów o dynamicznym rozmiarze. przestrzeń nazw: System.Collections
47 Metody i właściwości Add() – dodanie elementu na koniecAddRange() – dodanie kolekcji na koniec Insert() – wstawia element pod określonym indeksem InsertRange() – dodanie kolekcji pod określonym indeksem Remove() – usuwa pierwszej wystąpienie elementu RemoveAt() – usuwa element pod określonym indeksem RemoveRange() – usuwa zakres Sort() – sortowanie (uwaga na typy!) IndexOf() – pobranie numeru indeksu Count – zwraca liczbę elementów
48 Lista (ang. List
49 Metody i właściwości Add() – dodanie elementu na koniecAddRange() – dodanie kolekcji na koniec Insert() – wstawia element pod określonym indeksem InsertRange() – dodanie kolekcji pod określonym indeksem Find() – wyszukuje element i zwraca pierwsze wystąpienie FindAll() – wyszukuje wszystkie elementy i je zwraca w postaci listy Remove() – usuwa pierwszej wystąpienie elementu RemoveAt() – usuwa element pod określonym indeksem RemoveRange() – usuwa zakres Sort() – sortowanie (uwaga na typ!) IndexOf() – pobranie numeru indeksu Count – zwraca liczbę elementów
50 Przykład z własną klasąclass Osoba { public string Imie { get; set; } public int Wiek { get; set; } public Osoba(string imie, int wiek) this.Imie = imie; this.Wiek = wiek; } public override string ToString() return Imie + " " + Wiek;
51 List
52 List
53 Słownik (ang. Dictionary)Słownik – zbiór wyrazów ułożonych i opracowanych według pewnej zasady, zwykle objaśnianych pod względem znaczeniowym. Przykłady: trudne słowo – znaczenie słowo w języku polskim – słowo w języku angielskim Dictionary
54 Metody i właściwości Count – zwraca liczę par wartość-kluczKeys – zwraca liczbę klucz Values – zwraca liczbę wartości Add(TKey,TValue) – dodaje pozycję ContainsKey(TKey) – sprawdza czy słownik zawiera klucz ContainsKey(TValue) – sprawdza czy słownik zawiera wartość TryGetValue(TKey, TValue) – zwraca wartość dla podanego klucza (tu nie dostaniemy wyjątku!)
55 Dictionary
56 Posortowany Słownik (and. SortedDictionary)Zachowuje się podobnie jak słownik, z tą różnicą, że kolejne elementy dodawane do słownika są sortowane wg klucza. SortedDictionary
57 Lista posortowana (ang. SortedList
58 Lista połączona (ang. LinkedList
59
60 Metody i właściwości AddFirst – dodaje na początekAddLast – dodaje na koniec AddAfter – dodaje po AddBefore – dodaje przed RemoveFirst, RemoveLast, Remove – usuwanie Count Cointains, Find, FindLast
61 var gama = new LinkedList
62 BitArray Klasa BitArray to kolekcja wartości typu bool z możliwością dynamicznej zmiany rozmiaru. Pozwala efektywniej wykorzystać pamięć niż zwykła tablica lub struktura List wartości typu bool, ponieważ do przechowywania każdego elementu potrzebuje tylko jednego bitu, podczas gdy normalnie wartość typu bool zajmuje jeden bajt.
63 HashSet
64 Hashtable Niegeneryczna wersja klasy Dictionary
65 OrderedDictionary OrderedDictionary to niegeneryczny słownik przechowujący elementy w kolejności ich dodawania. W tej strukturze elementy dostępne są zarówno wg indeksu, jak i wg klucza. OrderedDictionary nie jest słownikiem posortowanym. Klasa OrderedDictionary jest kombinacją klas Hashtable i ArrayList, tzn. zawiera całą funkcjonalność pierwszej i kilka dodatkowych funkcji, takich jak RemoveAt i indeksator całkowitoliczbowy. Ponadto struktura ta udostępnia własności Keys i Values zwracające elementy w pierwotnym porządku.
66 ListDictionary Klasa ListDictionary przechowuje dane w liście powiązanej jednostronnie. Nie sortuje elementów, ale zapisuje je w kolejności dodawania. Struktura ta działa bardzo wolno, gdy jest duża. Jedyny sens jej istnienia to wysoka wydajność dla bardzo małych list (zawierających mniej niż dziesięć elementów).
67 HybridDictionary Klasa HybridDictionary to ListDictionary automatycznie konwertująca się na Hashtable po osiągnięciu określonego rozmiaru w celu uniknięcia problemów wydajnościowych. Chodzi o to, by jak najoszczędniej operować pamięcią, gdy słownik jest mały, oraz by zachować dobrą wydajność, kiedy się powiększy.
68 Collection
69 CollectionBase Niegeneryczna wersja Collection