Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Podobne dokumenty
Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Wykład 8: klasy cz. 4

Czym są właściwości. Poprawne projektowanie klas

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

TEMAT : KLASY DZIEDZICZENIE

Wykład 5: Klasy cz. 3

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Wykład 4: Klasy i Metody

Enkapsulacja, dziedziczenie, polimorfizm

Programowanie obiektowe

Diagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego.

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Rozdział 4 KLASY, OBIEKTY, METODY

Materiały do zajęć VII

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Dokumentacja do API Javy.

Polimorfizm. dr Jarosław Skaruz

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Zaawansowane programowanie w języku C++ Klasy w C++

Co to jest klasa? Z programistycznego punktu widzenia klasa stanowi typ danych, który odwzorowuje wspólne cechy jakiegoś obiektu.

Czym jest stos i sterta?

Programowanie obiektowe

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

PHP 5 język obiektowy

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

Podstawy Programowania Obiektowego

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Programowanie obiektowe

Definiowanie własnych klas

Klasy abstrakcyjne, interfejsy i polimorfizm

Technologie obiektowe

Kurs WWW. Paweł Rajba.

Aplikacje w środowisku Java

Dziedziczenie. Tomasz Borzyszkowski

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

OBIEKTY PHP. G. Panuś

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Języki i techniki programowania Ćwiczenia 2

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Do czego służą klasy?

Programowanie obiektowe

Deklaracja struktury w C++

Programowanie komputerowe. Zajęcia 7

Programowanie Obiektowo Zorientowane w języku C++ Klasy, pola, metody

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Różne właściwości. Różne właściwości. Różne właściwości. C++ - klasy. C++ - klasy C++ - KLASY

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Programowanie obiektowe

10. Programowanie obiektowe w PHP5

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Dziedziczenie. dr Jarosław Skaruz

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

Programowanie obiektowe. Dr hab. Inż. Marta Gładysiewicz-Kudrawiec Pokój 229 A1 Operatory new delete pliki-odczyt

C++ Przeładowanie operatorów i wzorce w klasach

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Programowanie obiektowe i zdarzeniowe

Szablony klas, zastosowanie szablonów w programach

Aplikacje w środowisku Java

PARADYGMATY PROGRAMOWANIA Wykład 4

Definicje klas i obiektów. Tomasz Borzyszkowski

Programowanie 2. Język C++. Wykład 3.

Technologie i usługi internetowe cz. 2

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Podstawy Programowania Obiektowego

Wprowadzenie do programowanie obiektowego w języku C++

Programowanie obiektowe. Materiały przygotował: mgr inż. Wojciech Frohmberg

Mechanizm dziedziczenia

Laboratorium 1 - Programowanie proceduralne i obiektowe

Język C++ zajęcia nr 2

Interfejsy i klasy wewnętrzne

Klasy i obiekty cz I Klasy, obiekty, podstawy używania obiektów

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Podstawy programowania obiektowego

Obiektowość mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2012

Funkcje wirtualne. Wskaźniki do klas pochodnych są podstawą dla funkcji wirtualnych i polimorfizmu dynamicznego.

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

Konstruktor kopiujacy

Klasy abstrakcyjne i interfejsy

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

class Student Deklaracja klasy Osoba: Deklaracja klasy Student:

Transkrypt:

Zrozumienie funkcji danych statycznych jest podstawą programowania obiektowego. W niniejszym artykule opiszę zasadę tworzenia klas statycznych w C#. Oprócz tego dowiesz się czym są statyczne pola i metody występujące w klasach. Ostatnim omówionym pojęciem będą statyczne konstruktory. Wstęp do klas w C# Język C# jest językiem w pełni obiektowym. Wszystko co tworzysz jest obiektem i dziedziczy po klasie Object. Programowanie obiektowe nie istniałoby bez pojęcia klasy. Nowo utworzona klasa jest nowym typem stworzonym przez programistę. Programista może utworzyć dowolną ilość klas. Każda z nich reprezentuje osobny byt. Dla przykładu, możemy utworzyć klasę człowiek, reprezentującą byt ludzki. Nie reprezentuje ona pojedynczej osoby o określonych cechach tylko ludzką rasę w znaczeniu ogólnym. Klasa reprezentująca typ człowiek skupia w sobie składniki, umożliwiające opisanie cechy konkretnego człowieka. Jeżeli chcemy aby nasza klasa (czyli nasz nowy typ) reprezentował konkretną jednostkę, należy utworzyć instancję klasy. Instancją klasy człowiek może być konkretna osoba o danym imieniu i nazwisku. Instancja klasy nazywana jest także obiektem danej klasy. Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu. Funkcje w klasach nazywamy metodami, a zmienne polami. Tworzą one składniki (składowe) klasy. Składniki klasy opisują stan instancji klasy. Klasy definiujemy przy pomocy słowa kluczowego class. Składniki klasy mogą być publiczne, prywatne lub chronione. Jeżeli składowa jest publiczna wtedy mogą z niej korzystać wszystkie inne obiekty z zewnątrz. Jeżeli jest prywatna to jest dostępna tylko wewnątrz naszej klasy. Oznacza to, że inne obiekty nie będą w stanie jej modyfikować ani odczytywać. Z kolei dostęp do składowych chronionych ma sama klasa oraz klasy dziedziczące po niej (podklasa). Jeżeli definiujemy składową bez modyfikatora dostępu, wtedy staje się ona automatycznie składową prywatną. Paradygmat programowania obiektowego mówi, aby wszystkie pola klasy definiować jako prywatne. Te pola, które powinny być dostępne na zewnątrz klasy nie powinny być publiczne, a jedynie rozszerzone o dodanie publicznych właściwości. Karol Trybulec p-programowanie.pl

Czym są właściwości możesz przeczytać przechodząc do artykułu Właściwości i akcesory get set. Oto ciało przykładowej klasy reprezentującej człowieka: class Czlowiek public string imie get; set; public int wiek get; set; public void wypiszrokurodzenia() Console.WriteLine("0 urodzil sie w roku ", imie, 0 - wiek); Klasa posiada dwie publiczne właściwości, które niejawnie generują dwa prywatne pola. Jest do skrócona forma deklaracji właściwości. Oprócz tego posiadamy publiczną metodę, wypisującą na ekran rok urodzenia na podstawie wieku. Oprócz tego, na etapie kompilacji do klasy zostanie niejawnie dołączony publiczny domyślny konstruktor. Gdyby nie to, to nie bylibyśmy w stanie utworzyć instancji klasy. Tworzenie instancji klasy może wyglądać następująco: 0 class Program static void Main() Czlowiek karol = new Czlowiek(); karol.imie = "Karol"; karol.wiek = ; karol.wypiszrokurodzenia(); Console.ReadKey(); class Czlowiek public string imie get; set; public int wiek get; set; public void wypiszrokurodzenia() Console.WriteLine("0 urodzil sie w roku.", imie, 0 - wiek); Karol Trybulec p-programowanie.pl

Kluczową linijką jest linijka nr. Składa się ona z dwóch kluczowych operacji. Pierwszą jest utworzenie referencji dla instancji klasy Czlowiek. Dzieje się to poprzez prostą deklarację Czlowiek karol;. Referencja zostaje zapisana na stosie jednak jest pusta (nie wskazuje na żadne miejsce w pamięci). Za pomocą operatora new przypisujemy do pustej referencji instancję klasy Czlowiek. Instancja klasy tworzona jest na stercie i zarządza nią mechanizm Garbage Collectora. Operator new wywołuje domyślny konstruktor, który został niejawnie dołączony do klasy w momencie kompilacji. Konstruktory w klasach Konstruktor ma za zadanie inicjalizowanie pól klasy domyślnymi wartościami, jest wywoływany w momencie tworzenia klasy. Konstruktor domyślny zostaje dołączony do klasy niejawnie w momencie kompilacji, dzięki temu możliwe jest utworzenie obiektu klasy operatorem new. Konstruktor jest metodą o takiej samej nazwie jak nazwa klasy. Warto wspomnieć o słowie kluczowym this. Zawiera ono w sobie referencję do danej instancji klasy w obszarze której jest używany. Przydaje się zawsze w momencie przesłaniania nazw zmiennych w konstruktorach i metodach. Dodajmy do naszej klasy konstruktor niestandardowy. Będziemy za jego pomocą pobierać imię oraz wiek człowieka: class Czlowiek public string imie get; set; public int wiek get; set; public void wypiszrokurodzenia() Console.WriteLine("0 urodzil sie w roku.", imie, 0 - wiek); public Czlowiek(string imie, int wiek) this.imie = imie; this.wiek = wiek; Nazwy argumentów konstruktora są takie same jak nazwy pól klasy. Przez to pola klasy zostały przesłonięte. Dzięki słowie kluczowemu this odwołujemy się do pól klasy. Ponieważ Karol Trybulec p-programowanie.pl

stworzyliśmy konstruktor niestandardowy, możemy utworzyć naszą klasę oraz zainicjalizować ją początkowymi wartościami: 0 class Program static void Main() Czlowiek karol = new Czlowiek("Karol", ); // dobrze Czlowiek pusty = new Czlowiek() // błąd kompilacji karol.wypiszrokurodzenia(); Console.ReadKey(); class Czlowiek public string imie get; set; public int wiek get; set; public void wypiszrokurodzenia() Console.WriteLine("0 urodzil sie w roku.", imie, 0 - wiek); public Czlowiek(string imie, int wiek) this.imie = imie; this.wiek = wiek; Zwróć uwagę na linijkę. Jest w niej wywoływany konstruktor domyślny. Niestety, ponieważ utworzyliśmy konstruktor niestandardowy, kompilator nie dołącza niejawnie domyślnego konstruktora. Jeżeli takiego potrzebujemy musimy dodać go sami. Kiedy dodamy do klasy konstruktor niestandardowy, kompilator nie utworzy niejawnie konstruktora domyślnego! Jeżeli takiego potrzebujemy, musimy zadeklarować go osobiście. Klasa może posiadać wiele różnych konstruktorów. Możliwe jest także zdefiniowanie konstruktora prywatnego. Wtedy nie będzie możliwości utworzenia instancji klasy. Jest to zabieg celowy i pożądany w kilku specyficznych sytuacjach, np. podczas implementacji wzorca projektowego Singleton. Karol Trybulec p-programowanie.pl

Metody i pola statyczne w klasie Krótkie wprowadzenie do klas pokazało Ci jak one funkcjonują. Wszystkie metody i pola w klasach są związane z określoną instancją. Przykładowo, możemy utworzyć wiele instancji klasy człowiek, każdy z nich będzie miał inny wiek oraz inne imię. Dodając do klasy metodę statyczną będzie ona związana z typem a nie instancją. Metody statycznej można używać bez konieczności tworzenia instancji klasy. Jest ona związana z typem. Metoda staje się metodą statyczną jeżeli dodamy do niej modyfikator static. Najlepszym przykładem metody statycznej jest główna funkcja programu o nazwie Main(). Czy nie zastanawiałeś się dlaczego zawsze poprzedzona jest słowem static? class Program static void Main() // pusty program Console.ReadKey(); Ponieważ w C# wszystko jest klasą i obiektem, to samo tyczy się głównego programu. Main() czyli element początkowy programu jest także metodą statyczną, dzięki temu może być wywołana bez konieczności tworzenia instancji klasy Program. Innym przykładem metody statycznej są wszystkie metody klasy System.Console: static void Main() Console c = new Console(); c.writeline("metoda niestatyczna"); //błąd Console.WriteLine("metoda statyczna"); //ok Console.ReadKey(); Metody klasy Console wywołujemy bez tworzenia instancji klasy. Próba utworzenia instancji wygeneruje błąd, ponieważ klasa System.Console także posiada modyfikator static. Oznacza to, że jest klasą statyczną i nie możliwe jest utworzenie jej instancji. Pola statyczne także są związane z typem klasy. Ich wartość jest wspólna dla każdej Karol Trybulec p-programowanie.pl

instancji. Nasuwa się pytanie, po co używać pól statycznych? Przydają się one w specyficznych sytuacjach. Działają podobnie na zasadzie zmiennych globalnych. Najczęściej polami statycznymi definiuje się pola, które dla każdej instancji powtarzają się (mają tą samą wartość). Przykład klasy statycznej Aby zobrazować funkcjonalność elementów statycznych w C#, utwórzmy przykładową klasę zawierającą stałe matematyczne. Mogłaby się przydać podczas pisania jakiegoś programu, który przeprowadza obliczenia. class Program static void Main() Console.WriteLine("Wartość PI to: 0", StaleMatematyczne.Pi); Console.ReadKey(); class StaleMatematyczne public static double Pi =.; public static double stalaeulera = 0.; public static double zlotypodzial =.; Jak widzisz, pola klasy StaleMatematyczne są statyczne, więc można ich użyć bez konieczności tworzenia instancji. Jednak klasa nie jest klasą statyczną i ciągle można utworzyć jej instancję. Ponieważ klasa udostępnia tylko kilka stałych, warto dodać do niej modyfikator static. Wtedy nikt bez potrzeby nie utworzy instancji obiektu. Rozszerzmy klasę, dodajmy do niej możliwość obliczania pola koła. Zmieńmy nazwę klasy na jakąś bardziej ogólną. Elementy statyczne mogą używać tylko danych statycznych i wywoływać metody statyczne. W przeciwnym wypadku wystąpi błąd kompilacji. Z uwagi na fakt opisany wyżej, metoda obliczająca pole koła musi być funkcją statyczną. Przykładowa implementacja wygląda następująco: Karol Trybulec p-programowanie.pl

0 class Program static void Main() int promien_kola = ; Matematyka.poleKola(promien_kola); Matematyka.obwodKola(promien_kola); Console.ReadKey(); class Matematyka public static double Pi =.; public static void polekola(int r) Console.WriteLine("Pole kola to: 0", Matematyka.Pi * r * r); public static void obwodkola(int r) Console.WriteLine("Obwód kola to: 0", Matematyka.Pi * r * ); Warto wspomnieć, że inicjalizacją domyślnych wartości dla pól klasy zajmuje się konstruktor, ale co w przypadku składników statycznych? Konstruktory statyczne Omawiając składniki statyczne koniecznie trzeba napisać kilka słów o statycznych konstruktorach w C#. Składową statyczną można zainicjalizować zwykłym konstruktorem, jednak ten zostanie wywołany tylko w przypadku utworzenia instancji klasy. Statycznego konstruktora używamy wtedy, kiedy chcemy zainicjalizować składową statyczną bez tworzenia instancji klasy. Jeżeli cała klasa jest statyczna, wtedy ratuje nas jedynie konstruktor statyczny. Jeżeli klasa jest zwykłą klasą, możemy rozważyć użycie tego lub tego, jednak inicjalizacja pola statycznego zwykłym konstruktorem jest dość nieprzewidywalna nigdy nie wiemy kiedy i czy programista zdecyduje się utworzyć instancję. Karol Trybulec p-programowanie.pl

Każda klasa może posiadać tylko jeden statyczny konstruktor i nie może on być ani publiczny ani prywatny (nie piszemy żadnych modyfikatorów). Jak myślisz, kiedy zostanie on wywołany? Nie jest to do końca jasne. Klasa może posiadać jeden konstruktor statyczny. Zostanie on wywołany w momencie tworzenia instancji klasy lub podczas odwoływania się do statycznego elementu klasy. Przykładowa definicja statycznego konstruktora: class Matematyka public static double Pi; static Matematyka() Matematyka.Pi =.; W przypadku połączenia konstruktora statycznego ze zwykłymi, zawsze pierwszy zostanie wywołany ten statyczny. Krótkie podsumowanie konstruktorów statycznych: w danej klasie może znajdować się tylko jeden statyczny konstruktor zostaje wykonany tylko raz niezależnie od ilości instancji klasy (w przypadku gdy także nie jest statyczna) nie ma żadnego modyfikatora dostępu nie może przyjmować żadnych argumentów jest wywoływany podczas tworzenia instancji (dla klas niestatycznych) lub podczas pierwszego dostępu do statycznej składowej jest thread-safe (synchronizacja wątków) zawsze wykonuje się przed zwykłymi konstruktorami Weź pod uwagę, że jeżeli jakaś klasa jest klasą niestatyczną, oraz posiada statyczne pole, to użycie zwykłego konstruktora do inicjalizacji statycznej zmiennej nie jest zbyt mądre. Utworzenie setek instancji klasy spowoduje zresetowanie i przypisanie na nowo statycznej zmiennej tyle samo razy. W przypadku użycia konstruktora statycznego operacja przypisania odbędzie się tylko raz. Karol Trybulec p-programowanie.pl