• Nie Znaleziono Wyników

Anatomia i "fizjologia" klas

N/A
N/A
Protected

Academic year: 2021

Share "Anatomia i "fizjologia" klas"

Copied!
23
0
0

Pełen tekst

(1)

Anatomia i "fizjologia" klas

Modyfikatory dostępu

Argumenty metod

Tworzenie obiektów

Hermetyzacja danych – akcesory

Składowe statyczne

Usuwanie obiektów

Przeciążanie metod i konstruktorów

(2)

2017-11-26 Metody programowania – 1 W3 2

Języki obiektowe charakteryzują się możliwością tworzenia nowych typów danych.

Trzy najważniejsze cechy klas to: hermetyzacja właściwości i zachowań, polimorfizm i dziedziczenie.

Elementy klasy – zachowanie i właściwości to składowe klasy.

Utworzenie klasy to kolejno jej deklaracja a następnie definicja jej metod i pól.

Pełna składnia deklaracji klasy ma postać:

[atrybuty][modyfikatory dostępu] class identyfikator [:klasa bazowa[.interfejsy]]{ciało klasy}

W deklaracji klasy modyfikatorem dostępu jest zwykle słowo kluczowe public Anatomia i fizjologia klas i obiektów

Obiekt to egzemplarz klasy.

Różnica pomiędzy klasą a obiektem jest taka jak pomiędzy np. typem int a zmienną typu int.

Przykład deklaracji klasy, definicji i jej użycia przedstawia listing 3.1

(3)

Listing 3.1

(4)

2017-11-26 Metody programowania – 1 W3 4

Tabela 3.1. Modyfikatory dostępu

Modyfikator dostępu Ograniczenia

public Brak ograniczeń. Składowe dostępne dla wszystkich metod wszystkich klas

private Składowe prywatne klasy A są dostępne tylko dla metod tej klasy

protected Składowe chronione klasy A są dostępne dla metod klasy A i dla metod klas potomnych A

internal Składowe wewnętrzne klasy A są dostępne dla metod wszystkich klas z podzespołu klasy A

protected internal Składowe chronione wewnętrzne klasy A są dostępne dla metod tej klasy, dla metod klas potomnych A oraz dla wszystkich metod wszystkich klas z podzespołu A

(5)

Domyślnym poziomem dostępu do składowych klasy jest poziom prywatny .

Listing 3.1 jest zatem poprawny. Wszystkie pola składowe klasy Czas są prywatne.

Dla zwiększenia czytelności źródła należy wyraźnie zaznaczyć nawet domyślny prywatny tryb dostępu. Deklaracje pól składowych klasy Czas powinny zatem wyglądać tak:

...

private int Rok; // Zmienne prywatne private int Miesiąc;

private int Dzień;

private int Godzina;

private int Minuta;

private int Sekunda;

...

Klasa Tester i metoda WyświetlCzas są publiczne, mogą z nich korzystać inne

klasy.

(6)

2017-11-26 Metody programowania – 1 W3 6

Argumenty metod

Metody mogą przyjmować dowolną liczbę parametrów.

Przykład przekazywania wartości do metody za pośrednictwem parametrów pokazuje listing 3.2.

(7)

Tworzenie obiektów

Obiekty są typami referencyjnymi, przechowywane są na stercie, a tworzy się je za pomocą operatora new, np.

Czas t = new Czas();

W ten sposób utworzono obiekt klasy Czasznalazł się on na stercie, a wartość zmiennej t jest jego adresem - referencją na pewien anonimowy obiekt w obszarze sterty.

Zmienna t nie zawiera "wartości" obiektu Czas, a tylko jego adres.

Zawsze, kiedy powstaje egzemplarz klasy następuje wywołanie specjalnej metody – konstruktora. Definicja konstruktora jest częścią klasy lub domyślnie udostępnia ją CLR.

Zadaniem konstruktora jest utworzenie obiektu danej klasy i nadanie mu prawidłowego stanu.

Jeżeli w deklaracji klasy (np. klasy Czas) nie zdefiniowano konstruktora, to kompilator automatycznie tworzy tzw. domyślny konstruktor klasy, który jedynie tworzy obiekt nie wykonując żadnych innych czynności.

Często jednak potrzebny jest specyficzny konstruktor klasy, który przyjmuje argumenty, co pozwala określić początkowy stan obiektu.

Konstruktor jest metodą o takiej samej nazwie jak klasa; nie zwraca żadnej wartości i na ogół jest publiczny.

Listing 3.3 przedstawia modyfikację klasy Czas – dodano do niej konstruktor.

(8)

2017-11-26 Metody programowania – 1 W3 8

(9)

Hermetyzacja danych – akcesory

Bezpośredni dostęp spoza klasy do prywatnych danych składowych – pól klasy opatrzonych atrybutem private.

Warto jednak pozostawić dane składowe jako prywatne co zapobiega przypadkowym zmianom ich wartości lub próbie odczytu danych przez obiekt zewnętrzny do tego nieuprawniony.

Hermetyzacjadanych polega na oddzieleniu stanu klasy od metod zmieniających ten stan.

Niektóre pola prywatne warto jednak udostępnić dla wykonywania na nich w sposób świadomy i kontrolowany określonych operacji.

Do tego celu służą elementy klasy zwane akcesorami.

Udostępniają one klientom prosty interfejs, który wygląda jak zwykła zmienna składowa.

Jednocześnie są metodami, które pozwalają ukryć dane, zabezpieczyć je przed

niekontrolowanym, przypadkowym odczytem, bądź co gorsze – niepożądanymi zmianami

wartości. Takie zabezpieczenie danych zwane hermetyzacją jest cechą „dobrego” programowania obiektowego.

Tworzenie i zastosowanie właściwości pełniących rolę akcesorówilustruje listing 3.4.

(10)

2017-11-26 Metody programowania – 1 W3 10

(11)
(12)

2017-11-26 Metody programowania – 1 W3 12

Składowe statyczne

Składowe klasy (zmienne, metody, zdarzenia itp.) mogą być:

- Składowymi egzemplarza (obiektu), - Składowymi statycznymi(klasy).

Składowe egzemplarza są związane z konkretnym obiektem (egzemplarzem klasy), a składowe statyczne są elementem klasy.

- Dostęp do składowych statycznych uzyskuje się przez nazwę klasy, - dostęp do składowych egzemplarza – przez nazwę obiektu.

W deklaracji składowej statycznej słowem kluczowym static określa się składowe statyczne.

Metody statyczne działają na klasach, a niena ich egzemplarzach (obiektach).

Przykłady metod statycznych:

WriteLine, ReadKeyw klasie Console, Parse w strukturze np. Double

Metoda Mainjest statyczna. Metody statyczne nie mają referencji this bo nie istnieje obiekt, na który ta referencja mogłaby wskazywać.

Metody statyczne nie mają bezpośredniego dostępu do składowych niestatycznych.

Metoda Mainmoże wywołać metodę niestatyczną tylko wtedy, gdy wcześniej utworzy obiekt (patrz listing 3.5).

(13)
(14)

2017-11-26 Metody programowania – 1 W3 14

(15)

Jeszcze jeden przykład, który ilustruje użycie składowych statycznych:

(16)

2017-11-26 Metody programowania – 1 W3 16

Usuwanie obiektów

Język C# obsługuje automatyczne odzyskiwanie pamięci – na ogół nie jest konieczne jawne usuwanie obiektów (tzw. garbage collection).

Jeżeli obiekt zawiera tzw. niezarządzane zasoby (są nimi np. pliki), to trzeba je zwolnić kiedy nie są już potrzebne.

Do niejawnej kontroli niezarządzanych zasobów służą destruktory.

Wywołuje je mechanizm odzyskiwania pamięci w momencie usuwania obiektu.

Destruktor powinien zwalniać zasoby wykorzystywane przez dany obiekt, ale nie może zmieniać stanu innych obiektów. Zmniejsza wydajność programu.

Destruktora nie można wywoływać samodzielnie – za jego wywołanie odpowiada mechanizm odzyskiwania pamięci.

Mechanizm odzyskiwania pamięci przechowuje listę obiektów zawierających destruktor.

Aktualizacja tej lista następuje w momencie powstania lub usunięcia obiektu.

Po zwróceniu do systemu pamięci zajmowanej przez obiekt system umieszcza go w kolejce obiektów czekających na usunięcie i dopiero na takim obiekcie system wykonuje operacje destruktora.

(17)

Przykładowy kod destruktora w klasie np. MojaKlasa ma postać:

~MojaKlasa() {

// potrzebne operacje }

Kompilator języka C# przekształci ten kod na:

protected override void Finalize() {

try {

// potrzebne operacje }

finally {

base.Finalize();

} }

(18)

2017-11-26 Metody programowania – 1 W3 18

Destruktora nie można wywoływać samodzielnie – w przypadku obsługi "cennych"

niezarządzanych zasobów (np. plików) trzeba użyć interfejsu Idisposable.

Interfejs ten wymaga, aby klasy dziedziczące go zawierały definicję metody Dispose() Jeżeli jest dostępna ta metoda, to system nie czeka na wywołanie destruktora, a wywołuje metodę Dispose().

Jeżeli udostępniono metodę Dispose(), to należy zablokować mechanizm odzyskiwania pamięci tak aby nie wywoływał destruktora.

W tym celu należy wywołać statyczną metodę GC.SuppressFinalize() z argumentem this (referencja na usuwany obiekt).

Przykład ilustruje listing 3.7.

(19)
(20)

2017-11-26 Metody programowania – 1 W3 20

(21)

Przeciążanie metod i konstruktorów

W przypadku konstruktorów, ale również innych metod w klasie wygodnym rozwiązaniem jest definiowanie i używanie kilku funkcji o tej samej nazwie.

Sygnatura metody to jej nazwa i lista parametrów.

Dwie metody mają różne sygnatury, jeżeli mają różne nazwy lub różne listy parametrów.

Klasa może zawierać dowolną liczbę metod jeżeli każda z nich ma niepowtarzalną sygnaturę.

Przykład klasy z dwoma konstruktorami (przeciążonymi) przedstawia listing 3.9.

Jeden z tych konstruktorów przyjmuje obiekt typu DateTime a drugi 6 liczb

całkowitych.

(22)

2017-11-26 Metody programowania – 1 W3 22

(23)

Cytaty

Powiązane dokumenty

Składniki klasy zadeklarowane z modyfikatorem dostępu protected są dostępne dla metod będących składnikami tej klasy oraz klas pochodnych w stosunku do niej.. class Wektor_2D

1 Język polski wszystkie Ciekawi świata – Język polski 5 – zakres podstawowy i rozszerzony.. Marcin Kurczab,

W centrum uwagi 2 – maturalne karty pracy do wiedzy o społeczeństwie dla liceum ogólnokształcącego i technikum –.

Zrozumieć przeszłość 3 – maturalne karty pracy do historii dla liceum. ogólnokształcącego i technikum – zakres

@private atrybut widoczny jedynie dla metod klasy, która go zadeklarowała. @protected Atrybut widoczny dla metod klasy, która go zadeklarowała, oraz dla klas

@private atrybut widoczny jedynie dla metod klasy, która go zadeklarowała. @protected Atrybut widoczny dla metod klasy, która go zadeklarowała, oraz dla klas

Uchwalenie Konstytucji wywołało sprzeciw wielu magnatów polskich i państw zaborczych, którzy nie chcieli reform. Targowica miasteczko na Ukrainie, w którym

Słowny zapis równania reakcji, przypomnienie substratów