Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
1
Programowanie Obiektowe – Wykład 8
dr Piotr Jastrzębski Wydział Matematyki i Informatyki
2
Tematyka wykładu właściwości indeksatory
enum, tablice, kolekcje – jeszcze raz
3
Filary programowania obiektowego
abstrakcja 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 osoba1
Osoba 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
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 obiektu
Osoba 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 odczytu
private int wiek; public int Wiek { get return wiek; }
13
Właściwość tylko do zapisu
private 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ści
domyś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ści
nie 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ści
modyfikatory 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ści
interface IWiek { int Wiek { get; set; } }
20
Właściwości wirtualne i ich przesłanianie
class 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ści
Osoba osoba1 = new Osoba() { Wiek = 22 };
22
Indeksatory zapewniają dostęp do tablic, list, słowników
podobne 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 odczytu
class 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<string, string> programy; public EdytoryTekstu() programy = new Dictionary<string, string>(); 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(); Console
EdytoryTekstu edytory = new EdytoryTekstu(); Console.WriteLine(edytory["doc"]); //Word edytory["doc"] = "Libre Office Writer"; Console.WriteLine(edytory["doc"]);
28
Tryb wyliczeniowy - enum
Daje 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 - enum
Deklaracja 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 wyliczenia
Jeś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)
36
Dwa typy niegeneryczny (Stack) generyczny (Stack<T>)
przestrzeń nazw: System.Collections Stack stos = new Stack(); generyczny (Stack<T>) przestrzeń nazw: System.Collections.Generic Stack<int> stos = new Stack<int>();
37
Metody i właściwości Push() – dodanie elementu
Pop() – 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<string> wyrazy = new Stack<string>(); wyrazy
Stack<string> wyrazy = new Stack<string>(); 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<string> wyrazy = new Stack<string>(); 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.
42
Dwa typy niegeneryczny (Queue) generyczny (Queue<T>)
przestrzeń nazw: System.Collections Queue kolejka = new Queue(); generyczny (Queue<T>) przestrzeń nazw: System.Collections.Generic Queue<int> kolejka2 = new Queue<int>();
43
Metody i właściwości Enqueue() – dodanie elementu na końcu kolejki
Dequeue() – 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<string> wyrazy = new Queue<string>(); wyrazy
Queue<string> wyrazy = new Queue<string>(); 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 koniec
AddRange() – 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<T>)
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 koniec
AddRange() – 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<Osoba> osoby = new List<Osoba>(); osoby
List<Osoba> osoby = new List<Osoba>(); 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<Osoba> osoby = new List<Osoba>(); osoby
List<Osoba> osoby = new List<Osoba>(); 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<string, string> słownik = new Dictionary<string, string>();
54
Metody i właściwości Count – zwraca liczę par wartość-klucz
Keys – 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<string, string> programy = new Dictionary<string, string>(); 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<string, string> słownik = new SortedDictionary<string, string>();
57
Lista posortowana (ang. SortedList<T>)
Zachowuje się podobnie jak posortowany słownik. SortedList<int,int> osoby = new SortedList<int,int>(); 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<T>)
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
60
Metody i właściwości AddFirst – dodaje na początek
AddLast – dodaje na koniec AddAfter – dodaje po AddBefore – dodaje przed RemoveFirst, RemoveLast, Remove – usuwanie Count Cointains, Find, FindLast
61
var gama = new LinkedList<string>(); gama
var gama = new LinkedList<string>(); 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<string> 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<T> i SortedSet<T>
Generyczne 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<T> przechowuje elementy w określonym porządku, a HashSet<T> nie przechowuje.
64
Hashtable Niegeneryczna wersja klasy Dictionary<TKey,TValue>.
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<T> Klasa Collection<T> to modyfikowalne opakowanie klasy List<T>. 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<T>.
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.