Kurs obiektowości w C#

Klasy w C#Część NR.1 Ostatnio skończyłem kurs: podstawy C#.Jednak nie było w nim nic o klasach i obiektach. Do pisania prostych programów rzeczywiście można się obyć bez klas. Jednak nie bez powodu C# jest językiem obiektowym .Nikt też nie da nagrody za napisanie programu, który dodaje dwie cyfry. Poprzedni kurs był dobry jako wstęp ,ale nie zmienia to faktu ,że trzeba jeszcze bardziej poszerzać wiedzę.

C# nie jest trudnym językiem programowania ,więc moim zdaniem nie będziesz miał z tym kursem dużych problemów.

Platforma .NET zawiera tysiące klas i nawet jeśli jesteś początkującym programistą C# na pewno zetknąłeś się z nimi. Klasy tworzą dobry mechanizm w zarządzaniu i modelowaniu encji manipulowanymi przez aplikacje. Encja może reprezentować określony przedmiot jak produkt, bądź pracownika albo nawet transakcjeEncje Klasy.

W zależności od naszego poziomu abstrakcji encje mogą prosto obrazować rzeczywistość bądź tworzyć cały złożony system.
Obiekty klas też mają różną długość życia. Niektóre obiekty służą do przechowywania informacji przez prawie cały proces aplikacji ,a niektóre z nich są usuwana zaraz po ich użyciu.

StatycznaCzęść NR.2

Przykładem klasy statycznej jest np. klasa Math , która zawiera wszystkie potrzebne funkcje matematyczne jak np. cosinus. Do ich użycia klasa nie musi być zadeklarowana o czym więcej w tym wpisie.

Klasa statyczna Math
Na pewno zauważysz ,że nie wszystkie metody należą do instancji klasy; są to metody, które wykonują swoje cele w sposób niezależny od specyfikacji zainicjalizowanej klasy. To są metody statyczne. Po co one są?

BoxingCzęść NR.6 Wszystko jest obiektem i wszystko w C# dziedziczy po System.Object ,tylko co z tego.

Informacje zawarte w tym wpisie będą przydatne również przy dziedziczeniu klas.
Nie mam ochoty pisać wstępu więc od razu przejdźmy do rzeczy.

 

 

System.Object

Wszystkie klasy i struktury dziedziczą po typie object. Możesz też użyć typu object do stworzenia zmiennej, która może referować do każdego typu.

EnumCzęść NR.7Typ wyliczeniowy, na który często mówię Enum (szkoda , że ta nazwa nie może być przyjęta Puszczam oczko) jest jedną z fajniejszych rzeczy w programowaniu. Dlaczego?

Choćby dlatego , że wyklucza wartości, których nie chcemy. Przykładowo do aplikacji chcemy aby użytkownik podał konkretny miesiąc, ponieważ nasza zmienna byłaby typem wyliczeniowym , a nie np. stringiem .

Nie byłoby mowy o podaniu niewłaściwej wartości, ponieważ sprawnie byśmy je przechwytywali.

Typy wyliczeniowe przydatne są także przy kontrolkach, jak ComboBox, ponieważ z góry wiemy, jakie pola może użytkownik wybrać.

Jednym słowem zamiana niektórych zmiennych z string na typ wyliczeniowy może bardzo usprawnić aplikacje. 

StrukturaCzęść NR.8 Klasy są typami referencyjnymi i ich zawartość jest zawsze tworzona na stercie. W niektórych wypadkach klasa zawiera tak niewielką ilość danych , że zarządzanie nimi na stercie jest nieopłacalne. W takich wypadkach lepiej użyć struktury.

Struktura jest typem wartościowym, czyli jej miejsce jest na stosie.

Chociaż jeśli struktura jest duża to lepiej stosować klasy.

Dla programistów C++
W C++ struktura to odpowiednik klasy, tylko jej składowe są publiczne (w klasie prywatne). W C# struktury to typ skalarny i podstawowe różnicę pomiędzy klasą i strukturą zostały opisane we wpisie

Podobnie jak klasy struktura może mieć własne pola i metody……oraz w pewnym specjalnym wypadku konstruktor.

Przykładem struktury jest np. Point w WPF i Windows Forms, która przechowuje dwie zmienne X i Y.

TabliceCzęść NR.9Tablica pozwala na przechowywanie zbioru wartości. W programowaniu mamy wiele sposobów przechowywania kolekcji wartości ,a tablice są jednym z tych sposobów.

Tablice mogą przechowywać tylko jeden określony typ wartości. NP. tablica int będzie mogła przechowywać tylko liczby tego typu.

W teorii tablica typu object może przechowywać wszystkie typy, ale odpakowywanie(unboxing) wartości z takiej tablicy może okazać się dość kłopotliwe.

DziedziczenieCzęść NR.11Jest to kurs obiektowości , a jeszcze nie było mowy o dziedziczeniu w C#. Chociaż dziedziczenie i polimorfizm pojawiały się w niektórych miejscach w innych wpisach.

Dziedziczenie to kluczowy mechanizm obiektowości. Dziedziczenie pozwala na powielanie funkcjonalności wobec różnych klas w ten sposób nie musimy pisać ciągle samego kodu. .

InterfejsCzęść NR.13Wcześniej dziedziczyliśmy z klas do klas jednak popularnym mechanizmem w dziedziczeniu są Interfejsy.

Interfejs nie zawiera żadnego kodu użycia natomiast zawiera tylko specyfikacje metod i jej właściwości. 

Interfejsy można traktować jak kontrakt, który gwarantuje ,że dana klasa lub struktura, która po nim dziedziczy obsługuje dane zachowania. .

Kiedy klasa obsługuje dany interfejs musi udostępniać wszystkie elementy tego interfejsu.

WłaściwościCzęść NR.15Hymn właściwości to ważny aspekt. Jak zauważysz pola w klasach .NET są zawsze prywatne natomiast właściwości udostępniają nam zmienne. Chociaż na potrzeby tego kursu na pewno zdarzały się sytuacje, w których pola w klasie czy strukturze były publiczne ,ale nie jest to poprawne zachowanie.

Kiedy chcesz przeczytać bądź zapisać zmienną zazwyczaj używasz symbolu przypisania, czyli znaku równa się ( = ). Dlatego stosowanie metod do wyświetlenia zawartości pól nie jest takim dobry pomysłem. Jest to wykonalne ,ale efekt nie jest taki zadowalający.

Oto przykład. Jak widzisz ilość kodu jest dość duża. Zrobiłem to specjalnie by wykazać ,że to podejście jest również słabe, właśnie z powodu ilości kodu.

OperatoryCzęść NR.16 Nie raz używałeś operatorów + – do typów wartościowych. Pytanie brzmi jak te operacje przenieść do swoich własnych klas i struktur.

Na początek mała powtórka z tego, czym są i jak działają operatory. 

 

Operatory, czym są tak naprawdę? Powtórka wiedzy

  • Używasz operatorów w kombinacji z operandami, które łącznie tworzą wyrażenie. Każdy operator ma swój własny cel i w zależności od typu operandów wykonuje różne polecenie. Przykładowe + dodaje liczby całkowite, ale również dodaje , a raczej łączy dwa łańcuchy znaków.
  • Każdy operator ma swoją odpowiednią kolejność. Mnożenie “ * ” wykona się wcześniej niż dodawanie “+”.
  • Każdy z operatorów ma swoją “łączność”. Mówiąc jaśniej każdy operator ocenia operacje w określonym kierunku “z lewej do prawej” czy “z prawej do lewej”. Operator “ = “ jest operacją wykonującą się od prawej strony do lewej więc a = b = c to samo co a = (b = c).
  • Mamy też do dyspozycji operatory jednoargumentowe jak inkrementacja (i++) i dekrementacja (i--)
  • Operacje dwuargumentowe wymagają dwóch operandów.

Zanim przejdziemy do nadpisywania operatorów należy zaznaczyć czego nie możemy nadpisać.

DelegatyCzęść NR.18Jak do tej pory widziałeś kod wykonujący się sekwencyjnie linijka po linijce. Spokojnie na programy wielowątkowe jest jeszcze za wcześnie ,ale zapewne zastanawiałeś się jak działają np. zdarzania w WPF.

[Wpis nadpisany 2015-01-15]

Przepływ programu, w takim wypadku na pewno nie jest jednokierunkowy.

LambdaCzęść NR.19Przykłady z poprzedniego wpisu dodają do delegaty konkretne metody. Dla przypomnienia prosty przykład użycia delegaty.

Jeśli Google odesłało cię tutaj po informacje o tym, jak korzystać z delegat, to polecam poprzedni wpis kursu.

Klasa MaszynaPracująca ma do dyspozycji pewien zestaw metod.

ZdarzeniaCzęść NR.20 Zobaczyłeś już jak zadeklarować delegat i jak jej użyć.

Widziałeś też co potrafią wyrażenia lambda w C#.
Jednak to jeszcze nie koniec. Co prawda możesz wywołać wiele metod nie bezpośrednio za pomocą delegaty, ale wciąż musisz ją wywołać jawnie.

Z programistycznego punktu widzenia dobrze byłoby , aby delegaty uruchomiały się automatycznie, gdy coś ważnego się wydarzy.

Przykładowo, w przypadku przegrzewania się reaktora atomowego wywołać odpowiednią delegate, która wykona wszystkie metody po kolei w celu jego wyłączenia .

GenericsCzęść NR.21

Podczas kursu była mowa o tablicach, które są stworzone do przechowywania typów wartościowych. Przy typach referencyjnych wykonuje się pakowanie i używanie tablic ich traci sens. Tablice mają określoną wielkość i aby ją zmienić trzeba stworzyć ją od nowa.

Klasy z System.Collection jak ArrayList czy HashTable przechowują wszystko jako obiekty więc pakowanie i wypakowywanie zawsze zachodzi bez względu na to, czy jest to typ wartościowy, czy też nie. Mimo iż są elastyczne z powodu przechowywania wszystkiego jako obiekt możemy zderzyć się z błędem przy rzutowaniu.

Od C# 2.0 mamy do dyspozycji jeszcze inne klasy kolekcji i są one najczęściej używane.

DestruktorCzęść NR.22 Jak pamiętasz typy wartościowe są tworzone na stosie ,a typy referencyjne są umieszczane na stercie. Komputery nie mają nieskończonej pamięci więc pamięć musi zostać odnowiona kiedy dana zmienna bądź obiekt nie jest już potrzebny. Typy wartościowe zostają zniszczone wraz ze swoją pamięcią, kiedy wychodzą poza zakres.

Zmienne są tworzone np. w czasie metody więc znikają po jej wykonaniu.

Poza tym typy wartościowe nie przechowują dużo informacji więc nie ma z nimi dużego problemu.

Ale co z typami referencyjnymi . Tworzysz obiekt za pomocą słowa kluczowego new ,ale jak obiekt jest niszczony w C#. Przekonajmy się.

ŚciągaCzęść NR.23Kurs dobiegł końca. Przyszedł czas na podsumowanie jego zawartości w pigułce. W sumie w tym kursie chciałem napisać jeszcze o innych rzeczach jak: indeksery , tworzenie własnych kolekcji od <T> czy jak efektywnie korzystać z innych słów kluczowych. Kurs jednak zrobił się za długi i nawet jego nazwa “obiektowość” nie jest do końca już trafna.

Wszystkie Kategorie