Programowanie Obiektowe – Wykład 2 dr Piotr Jastrzębski Wydział Matematyki i Informatyki http://wmii.uwm.edu.pl/~piojas/ piojas@matman.umw.edu.pl
Powtórka: klasa vs obiekt „szablon”/ „foremka” abstrakcyjny twór przechowuje cechy, a nie wartości Obiekt konkretny egzemplarz danej klasy przechowuje konkretne wartości
Założenia/filary programowania obiektowego: Abstrakcja Hermetyzacja Dziedziczenie Polimorfizm
Abstrakcja - polega na ukrywaniu lub pomijaniu mało istotnych informacji a skupieniu się na wydobyciu informacji, które są niezmienne i wspólne dla pewnej grupy obiektów. Klasa
Hermetyzacja lub inaczej mówiąc enkapsulacja polega na ukrywaniu nieistotnych informacji na temat obiektu w celu zminimalizowania efektów jego modyfikacji oraz na oddzieleniu tego co zawiera i co może zrobić obiekt od tego jak jest zbudowany i jak to robi. Modyfikatory dostępu
Dziedziczenie pozwala rozszerzać możliwości klas poprzez implementacje osobnych klas rozszerzających. Dzięki dziedziczeniu możemy tworzyć nowe klasy w oparciu o już istniejące, bez potrzeby implementowania tych funkcjonalności, które zostały już zaimplementowane w klasach bazowych.
Polimorfizm pozwala traktować różnorodne dane w ten sam sposób, w zależności od kontekstu. W trakcie wykonywania programu automatycznie są znajdowane i interpretowane odpowiednie metody w zależności od tego jak chcemy traktować nasze dane.
Pierwsza klasa - Dom public class Dom { public int powierzchnia; public bool garaz; public int iloscPokoi; public bool ogrod; public int iloscPieter; public int PodajCene() { return powierzchnia*3000; } }
Definicja klasy: modyfikator_dostępu class NazwaKlasy { deklaracje pól i metod }
Modyfikatory dostępu Umożliwiają określenie dostępu do danego elementu z zewnątrz klasy. Rodzaje: publiczne (public), chronione (protected), wewnętrzne (internal), wewnętrzne chronione (protected internal), prywatne (private).
Modyfikatory dostępu: public - elementy publiczne, dostępnymi na zewnętrz klasy, private – elementy prywatne, a dostęp do nich z poza klasy, będzie niemożliwy, internal - nie będą udostępniane na zewnątrz podzespołu, protected – elementy traktowane jako chronione, będą dostępne dla danej klasy oraz na potrzeby klas dziedziczonych, nie będą natomiast widoczne na zewnątrz klasy
Pola Zmienne przechowywane w danej klasie. Deklaracja: modyfikator typ_danych nazwaPola; np. public int powierzchnia;
Pole a zmienna W przeciwieństwie do zmiennych pole, jeżeli nie zostanie zainicjowane, po utworzeniu obiektu danej klasy automatycznie przyjmie swoją wartość domyślną, odpowiednio: dla typów liczbowych będzie to 0, dla łańcucha pusty ciąg oznaczany jako "" dla typu boolean wartość false; a dla typów referencyjnych null.
Możliwe modyfikatory public private internal protected readonly – tylko do odczytu, wartość do pola oznaczonego jako readonly możemy przypisać w chwili deklaracji takiego pola lub w konstruktorze klasy. static - takie pole jest częścią stanu klasy.
Metody definiują zachowanie, umożliwiając im wykonywanie konkretnych zadań, nie można ich definiować poza ciałem klasy. Deklaracja: modyfikator typ zwracany przez metodę nazwa metody (NazwaMetody()) lista typów i nazw parametrów metody
Modyfikatory metod (poza standardowymi): virtual override new sealed abstract static - może być wywoływana bez konieczności tworzenia obiektu extern – implementacja zewn.
Przykłady public int PodajCene() { return powierzchnia*3000; } public int PoliczSume(int liczba1, int liczba2) { return liczba1 + liczba2; }
Przykłady public void WyswietlImie() { Console.WriteLine(imie); } void – metoda nie zwraca żadnej wartości, typ pusty
Przeciążanie metod Przeciążone metody to takie, które: mają taki sam typ zwracany, mają identyczną nazwę, różnią się tylko ilością lub typami przekazywanych parametrów.
Przykład static string OpiszTyp() { return "Metoda bez argumentów"; } static string OpiszTyp(int x) return "Liczba całkowita"; static string OpiszTyp(string x) return "Łańcuch znaków"; static string OpiszTyp(double x, int y) return "Liczba double i liczba całkowita";
Tworzenie obiektów - operator new Deklaracja typ nazwaObiektu = new NazwaKlasy() Przykład: Dom domBasi = new Dom();
Odwołanie się do pól klasy nazwaObiektu.nazwaPola Przykład: domBasi.powierzchnia = 200; domBasi.garaz = true; domBasi.iloscPokoi = 7; domBasi.ogrod = false; domBasi.iloscPieter = 1;
Operator new/Konstruktor Operator new automatycznie wywołuje konstruktor. Konstruktor metoda wykonywana zaraz przy tworzeniu instancji obiektu, zawiera modyfikatory dostępu i parametry, nazwa pokrywa się z nazwą klasy.
Przykłady Konstruktor domyślny public Dom() { } Konstruktor domyślny z wartościami public dom() powierzchnia = 150;
Przykłady Konstruktor z parametrami public Dom(int powierzchnia) { this.powierzchnia = powierzchnia; } Deklaracja obiektu z parametrem Dom domBasi = new Dom(250);
Po co przydają się konstruktory? Nie trzeba wywoływać dodatkowych metodą, inicjują stan klasy na początku. Lepsza czytelność i zwięzłość kodu.
Niszczenie obiektów Język C# automatycznie odzyskuje pamięć (nie trzeba jawnie usuwać obiektów). Czasem jednak chcemy samodzielnie zarządzać zasobami pamięci – w tym celu mamy destruktor. Deklaracja: ~NazwaKlasy { instrukcja do wykonania przy niszczeniu; }
Przykład ~Car() { Console.WriteLine(„Jestem niszczony”); }