Programowanie Obiektowe – Wykład 8

1 Programowanie Obiektowe – Wykład 8dr Piotr Jastrzębski ...
Author: Rafał Kowalski
0 downloads 5 Views

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 programy; public EdytoryTekstu() programy = new Dictionary(); programy.Add("txt", "Notepad"); programy.Add("cs", "Visual Studio"); programy.Add("doc", "Word"); } public string this[string indeks] get { return programy[indeks]; } set { programy[indeks] = value; }

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)przestrzeń nazw: System.Collections Stack stos = new Stack(); generyczny (Stack) przestrzeń nazw: System.Collections.Generic Stack stos = new 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 wyrazy = new Stack(); wyrazyStack wyrazy = new Stack(); wyrazy.Push("raz"); wyrazy.Push("dwa"); wyrazy.Push("trzy"); Console.WriteLine(wyrazy.Contains("cztery"));//False Console.WriteLine(wyrazy.Contains("dwa"));//True foreach(var element in wyrazy)// "trzy" "dwa" "raz" { Console.WriteLine(element); } Console.WriteLine(wyrazy.Pop());//usuwa i zwraca "trzy" Console.WriteLine(wyrazy.Peek());//zwraca "dwa"

39 Co z sortowaniem elementów stosu?Stack wyrazy = new Stack(); wyrazy.Push("raz"); wyrazy.Push("dwa"); wyrazy.Push("trzy"); //wyrazy.Sort(); //nie działa var sort = wyrazy.OrderBy(x => x); foreach(var element in sort) { Console.WriteLine(element); }

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)przestrzeń nazw: System.Collections Queue kolejka = new Queue(); generyczny (Queue) przestrzeń nazw: System.Collections.Generic Queue kolejka2 = new 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 wyrazy = new Queue(); wyrazyQueue wyrazy = new Queue(); wyrazy.Enqueue("raz"); wyrazy.Enqueue("dwa"); wyrazy.Enqueue("trzy"); Console.WriteLine(wyrazy.Contains("cztery"));//False Console.WriteLine(wyrazy.Contains("dwa"));//True foreach(var element in wyrazy)//wypisuje "raz" "dwa" "trzy" { Console.WriteLine(element); } Console.WriteLine(wyrazy.Dequeue());//usuwa i zwraca "raz" Console.WriteLine(wyrazy.Peek());//zwraca "dwa"

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)Generyczna kolekcja na przechowywanie tablic obiektów o dynamicznym rozmiarze. przestrzeń nazw: System.Collections.Generic

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 osoby = new List(); osobyList osoby = new List(); osoby.Add(new Osoba("Jan",33)); osoby.Add(new Osoba("Agnieszka", 26)); osoby.Add(new Osoba("Zofia", 26)); var element = osoby.Find(x => x.Wiek == 26); Console.WriteLine(element.ToString()); //zwraca Agnieszka 26

52 List osoby = new List(); osobyList osoby = new List(); osoby.Add(new Osoba("Jan",33)); osoby.Add(new Osoba("Agnieszka", 26)); osoby.Add(new Osoba("Zofia", 26)); var wyszukane = osoby.FindAll(x => x.Wiek == 26); foreach(var element in wyszukane) { Console.WriteLine(element.ToString()); }

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 słownik = new 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 programy = new Dictionary(); programy.Add("txt", "Notepad"); programy.Add("cs", "Visual Studio"); programy.Add("doc", "Word"); foreach(var element in programy) { Console.WriteLine(element); }

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 słownik = new SortedDictionary();

57 Lista posortowana (ang. SortedList)Zachowuje się podobnie jak posortowany słownik. SortedList osoby = new SortedList(); różnice: SortedList używa mniej pamięci SortedDictionary jest szybsze przy operacji wstawiania i usuwania danych jeśli elementy są już posortowane, to SortedList jest szybsze

58 Lista połączona (ang. LinkedList)klasa generyczna lista powiązana dwustronnie łańcuch węzłów, każdy jest powiązany z następnym, poprzednim i z samym sobą zaleta: można wstawić element w dowolny miejscu listy wada: brak bezpośredniego mechanizmu sortowania

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(); gamavar gama = new LinkedList(); gama.AddFirst("do"); // do gama.AddLast("sol"); // do-sol gama.AddAfter(gama.First, "re"); // do-re-sol gama.AddAfter(gama.First.Next, "mi"); // do-re-mi-sol gama.AddBefore(gama.Last, "fa"); // do-re-mi-fa-sol gama.RemoveFirst(); // re-mi-fa-sol gama.RemoveLast(); // re-mi-fa LinkedListNode miNuta = gama.Find("mi"); gama.Remove(miNuta); // re-fa gama.AddFirst(miNuta); // mi-re-fa foreach (string s in gama) Console.WriteLine(s);

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 i SortedSetGeneryczne kolekcje, które wprowadzono odpowiednio w .NET Framework 3.5 i 4.0. Wspólne cechy: Metody Contains charakteryzują się dużą szybkością działania dzięki posługiwaniu się algorytmem wyszukiwania wykorzystującym wartości skrótu. Nie przechowują duplikatów i niepostrzeżenie ignorują żądania dodania elementów takich samych jak elementy istniejące. Nie ma możliwości odwołania się do elementu po jego pozycji. Klasa SortedSet przechowuje elementy w określonym porządku, a HashSet nie przechowuje.

64 Hashtable Niegeneryczna wersja klasy Dictionary.Uwaga: lepiej nie tłumaczyć tego na polski jako tablica skrótów. W różnych kontekstach może znaczyć coś innego.

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 Klasa Collection to modyfikowalne opakowanie klasy List. Mamy dodatkowe metody wirtualne: protected virtual void ClearItems(); protected virtual void InsertItem (int index, T item); protected virtual void RemoveItem (int index); protected virtual void SetItem (int index, T item);

69 CollectionBase Niegeneryczna wersja Collection.