Spis treści I. Klasy Materiały do zajęć VII II. III. Konstruktor Właściwości i indeksatory Klasy Programowanie obiektowe wiadomości wstępne Paradygmat programowania obiektowego Abstrakcja Hermetyzacja (enkapsulacja) Dziedziczenie Polimorfizm Modyfikatory dostępu ukrywanie informacji Private - Wywołanie dostępne tylko z metod danej klasy Public - Wywołanie ogólnie dostępne Protected - niedostępna dla wszystkich innych klas (nawet w tym samym podzespole), z wyjątkiem tych, które z niej bezpośrednio dziedziczą i ją rozszerzają internal dostępność w obrębie tego samego podzespołu internal protected połączenie internal i protected przy czym zastosowana reguła zależy od kontekstu wywołania 1
Definicja klasy [modyfikatordostępu] class Nazwa class Nazwa public int a; public void Metoda() a = 10; Składowe klasy [modyfikatordostępu] nazwatypu nazwazmiennej Metody w klasie [modyfikatordostępu] typzwracany nazwametody(listaargumentow) instrukcje; Tworzenie obiektu (użycie operatora new) Nazwa n; n= new Nazwa(); //lub prościej Nazwa n1 = new Nazwa(); n.a =7; //zmiana wartości publicznej składowej klasy Console.WriteLine(n.a); //odczytanie wartości publicznej składowej klasy n.metoda(); // wywołanie publicznej metody Słowo kluczowe this this.a; //odwołanie się do składowej klasy wykorzystywane wewnątrz metod a; // jw. Pod warunkiem, że nie została zdefiniowana zmienna lokalna o takiej samej nazwie, wówczas dotyczy zmiennej lokalnej public void Metoda(int a) a=5; // odwołanie do zmiennej lokalnej z listy argumentów metody this.a =6; // odwołanie do składowej klasy Console.WriteLine ( a = 0, this.a = 1,a,this.a); Ukrywanie informacji przykład class Nazwa public int a; private int b; public void metoda(nazwa n) a = 1; //OK, odwołanie do "swojego" pola publicznego b = 5; //OK, odwoałanie do "swojego" pola prywatnego metoda(); //OK, wywołanie "swojej" prywatnej metody n.a = 10; //OK, odwołanie do publicznego pola "własnej" klasy n.b = 50; //OK, odwołanie do prywatnego pola "własnej" klasy n.metoda2(); //OK, wywołanie prywatnej metody "własnej" klasy // 2
private void metoda2() Console.WriteLine( Metoda 2 z klasy nazwa ); class Klasa private double c; public void metoda(nazwa n) n.a = 11; //OK, odwołanie do pola publicznego innej klasy n.metoda(); //OK, wywołanie metody publicznej innej klasy n.b = 55; //błąd kompilacji, odwołanie do pola prywatnego innej klasy n. metoda2(); //błąd kompilacji, wywołanie metody prywatnej innej klasy c= 12.3; //OK, odwołanie do "swojego" pola publicznego Nowe podejście do programu komputerowego: Program komputerowy przestajemy definiować jako ciąg kolejnych instrukcji do wykonania, ale jako zbiór obiektów między, którymi istnieją zdefiniowane zależności. Obiekty te przekazują sobie wzajemnie informacje w postaci komunikatów czy zdarzeń za pomocą, których oddziaływają na siebie wzajemnie. Klasy częściowe //Nazwa.cs //częściowa definicja klasy //Nazwa1.cs //częściowa definicja klasy Metody częściowe //Nazwa.cs public void metoda() int a; metoda1(a++);. partial void metoda1(int a); //Nazwa1.cs partial void metoda1(int a) Właściwości metod częściowych muszą być definiowane w klasach częściowych (partial) typem przekazywanym (zwracanym) musi być void nie mogą posiadać modyfikatora dostępu (jak również innych modyfikatorów, takich jak virtual, sealed czy new) domyślnie prywatne mogą być metodami statycznymi lub obiektu można przekazywać do nich parametry poza przesyłaniem argumentu jako parametr wyjściowy out nie musi być części implementacyjnej 3
Modelowanie klas class NazwaKlasy public int Pole1; private double pole2; public int Metoda1(string arg1) private void metoda2() +Pole1 : int - Pole2 : double Nazwa klasy + Metoda1( in arg1 : sting) : int - metoda2() : void Konstruktor Definicja konstruktora Metoda klasy Metoda wywoływana zaraz po utworzeniu obiektu Nazwa konstruktora jest taka sama jak nazwa klasy w której jest zdefiniowany Brak typu zwracanego przez metodę Wywoływany przy użyciu operatora new Można go przeciążyć Można określić modyfikator dostępu Przykład konstruktora class NazwaKlasy public NazwaKlasy() //konstruktor bezargumentowy public NazwaKlasy(int arg1,double arg2) //konstruktor z argumentami Konstruktor bezargumentowy Generowany automatycznie przez kompilator, jeżeli nie ma innego konstruktora W przeciwieństwie do struktur w klasie jeśli zdefiniowano konstruktor z większą niż zero liczba argumentów, brak jest konstruktora domyślnego Inne nazwy dostępne w literaturze domyślny domniemany Przykład użycia NazwaKlasy n1 = new NazwaKlasy(); NazwaKlasy n1 = new NazwaKlasy(1, 2.3); 4
Możliwości wywoływania konstruktorów w celu zdefiniowania działania innych konstruktorów Lista inicjalizacyjna konstruktora Uwaga na wywołania rekurencyjnie (stanowią błąd) Wywoływany przez operator Wywoływany przez operator new Można go przeciążyć class NazwaKlasy private Typ1 pole1; private Typ2 pole2; private Typ3 pole3 public NazwaKlasy(): this(war1) public NazwaKlasy(Typ1 arg1):this(arg1, war2) public NazwaKlasy(Typ1 arg1, Typ2 arg2) :this(arg1, arg2, war3) public NazwaKlasy(Typ1 arg1, Typ2 arg2, Typ3 arg3) pole1 = arg1; pole2 = arg2; pole = arg3; Inicjalizacja obiektów class K1 public int A; public int B; class K2 public int X; public int Y; public K1 K; K2 a = new K2 X=1, K = new K1A =10, B=20 ; K1 k = new K1()A =20, B=30; Własności inicjalizatorów: Nie wszystkie pola muszą być inicjalizowane w inicjalizatorze Wcześniej jest wywoływany konstruktor domyślny, chyba że wskażemy inny Inicjalizatory mogą być zagnieżdżone Można inicjalizować klasy i struktury Kolejność inicjalizacji Pola są inicjalizowane wartością zero dla danego typu Nadawane są wartości przypisane w miejscu definicji private int nazwapola = 1; Wartość przypisana w konstruktorze. Wartości przypisane w konstruktorze wywołanym na liście inicjalizacyjnej są nadpisywane Wartości przypisane przy pomocy inicjalizatora obiektów Destruktor W programowaniu obiektowym metoda wywoływana tuż przed zwolnieniem pamięci przez obiekt Definicja destruktora ~NazwaKlasy() Metoda Finalize Interfejs IDisposable jest niedeterministyczny, wywoływany przez GarbageColector przed zwolnieniem pamięci zajmowanej przez obiekt W c# możemy unikać tworzenia destruktora 5
Struktury różnice w stosunku do klas Typ wartości Typ referencyjny Nie można deklarować konstruktora domyślnego - można Wszystkie pola muszą być zainicjalizowane w konstruktorze konstruktor może definiować dowolną liczbę pól Konstruktor domyślny jest zawsze generowany w klasie jest generowany do puki nie utworzymy dowolnego innego konstruktora Nie można nadawać polu wartości w miejscu definicji domyślne wartości w klasie można nadawać składowym w miejscu definicji Właściwości i indeksatory Wstęp Pełna enkapsulacja dostęp do pól składowych Indeksator klasa z polem składowym będącym kolekcją, dostęp do elementu kolekcji przy pomocy indeksu Właściwość Definiuje wirtualny atrybut get - właściwość do odczytu set - właściwość do zapisu element o nazwie value [modyfikator dostępu] typ Nazwa get set Właściowści przykład class Student private int numerindeksu; public int NumerIndeksu //definicja właściwości get return numerindeksu; set numerindeksu = value; Student s = new Student(); s.numerindeksu = 1234; int nr = s.numerindeksu; Console.WriteLine(s.NumerIndeksu); Definicja set i get może być utworzona jako: virtualne abstrakcyjne (czysto virtualne) metody statyczne public int wlasnosc private set wlasnosc = value; get return wlasnosc; 6
Własności automatyczne Cechy własności class Osoba public int NumerIndeksu set; get; class Student private int numerindeksu; public int NumerIndeksu //definicja właściwości get return numerindeksu; set numerindeksu = value; Zapewniają dostęp do składowych zarówno odczyt jak i zapis przy wykorzystaniu spójnej konwencji Można ograniczać dostęp dowolnie, albo względem odczytu albo względem ustawienia wartości Tworząc własność tworzymy jakby atrybut klasy, ale w rzeczywistości wywoływane są pewne funkcje Indeksatory definicja [modyfikator_dostepu] typ this[typ1, typ2 ] get set Składowe const i readonly Pole readonly można jej nadać wartość tylko w konstruktorze i w miejscu definicji każdy obiekt może mieć inną wartość tego pola Pola const Wartość musimy być przypisana w miejscu definicji 7