[ Pobierz całość w formacie PDF ]
może zawierać część . Część zwraca wartość właściwości, a część używana
jest do jej ustawienia. Specjalna zmienna o nazwie oznacza wartość przekazaną
podczas ustawiania właściwości. Mimo że właściwość implementowana jest jak meto-
da, to klient korzysta z niej jak z pola. Przykład:
Programiści znający VB natychmiast zauważą podobieństwo tej konstrukcji do kon-
strukcji i występujących w poprzednich wersjach VB. Na-
leży podkreślić, że właściwości takie mogą być w .NET użyte w każdym języku pro-
gramowania, również w C# i C++. Ponadto, z właściwości w klasie napisanej w jednym
z języków platformy .NET można korzystać w dowolnym innym języku tej platformy.
Właściwości nie muszą li tylko być używane do obsługi stanu obiektu, co stanowi fun-
damentalną różnicę między właściwościami a polami. Można, na przykład, zdefiniować
właściwość tylko do odczytu, która pobiera swoją wartość z bazy danych lub innego
zródła.
.NET został zaprojektowany do tworzenia aplikacji z graficznym interfejsem użytko-
wania i aplikacji dla sieci WWW. Krytycznym elementem takich aplikacji są zdarzenia
(ang. event) i ich obsługa. Z tego powodu Microsoft postanowił, że obsługa zdarzeń bę-
dzie częścią CLR. Klasa obsługująca zdarzenia może informować zainteresowanych
odbiorców, że zdarzenie zaszło. Tak więc odbiorcy mogą być subskrybentami interesu-
jących ich zdarzeń zdefiniowanych w klasie, która jest zródłem tych zdarzeń. Typowym
przykładem jest przycisk umieszczony na formularzu. Przycisk może zgłaszać zdarzenie
(przyciśnięto), a formularz może być subskrybentem tego zdarzenia. Ilekroć
przycisk zostaje przyciśnięty, formularz zostanie o tym poinformowany. Zdarzenia to
podstawowa technika przy tworzeniu graficznego interfejsu użytkownika, ale można z nich
korzystać w innych celach.
Modyfikatory klas
W tabeli 2.1 zawarto modyfikatory, którymi mogą być oznaczone klasy w .NET. Spo-
sób zapisu tych modyfikatorów jest różny w poszczególnych językach programowania.
W tabeli 2.2 znajdują się modyfikatory, które mogą mieć składowe klas.
TabeIa 2.1. Modyfikatory klas w środowisku .NET
ModyfIkator OpIs
Oznacza klasę, która nie może być klasą bazową.
Oznacza klasę implementującą jeden lub więcej interfejsów.
Oznacza klasę zawierającą jedną lub więcej metod abstrakcyjnych. Nie można tworzyć
obiektów klas abstrakcyjnych.
Oznacza klasę pochodną innej klasy.
Oznacza klasę widoczną na zewnątrz podzespołu.
Oznacza klasę niewidoczną na zewnątrz podzespołu.
RozdzIał 2. ModeI programowanIa w środowIsku .NET 61
TabeIa 2.2. Modyfikatory składowych klas w środowisku .NET
ModyfIkator OpIs
Metoda niemająca ciała jest metodą abstrakcyjną. Klasa zawierająca choć jedną metodę
abstrakcyjną jest klasą abstrakcyjną. Klasa pochodna klasy abstrakcyjnej musi zawierać
implementacje metod abstrakcyjnych.
, , Składowa oznaczona modyfikatorem jest dostępna tylko w klasie, w której jest
, zdefiniowana. Składowa oznaczona modyfikatorem jest powszechnie dostępna.
, Składowa oznaczona modyfikatorem dostępna jest w klasie, w której
jest zdefiniowana i w jej podklasach4. Składowa oznaczona modyfikatorem
jest dostępna w klasach zdefiniowanych w tym samym podzespole. Składowa oznaczona
modyfikatorem dostępna jest w podklasach i w klasach
zdefiniowanych w tym samym podzespole.
Składowa oznaczona modyfikatorem nie może być przesłonięta w podklasach.
Składowa oznaczona modyfikatorem przesłania składową odziedziczoną
po klasie bazowej.
Składowa oznaczona modyfikatorem jest częścią składową klasy, a nie
poszczególnych obiektów. Jest ona współdzielona przez wszystkie obiekty danej klasy.
Z takiej składowej można korzystać nawet wtedy, gdy nie istnieje żaden obiekt tej klasy.
Modyfikator używany jest do oznaczenia składowych o takich samych
nazwach, ale różniących się listą parametrów.
Składowa oznaczona modyfikatorem wywoływana jest za pomocą techniki
póznego wiązania. Wybór wywoływanej metody następuje na podstawie typu obiektu,
z którego metoda jest wywoływana, a nie na podstawie typu zmiennej referencyjnej,
za pośrednictwem której sięga się do obiektu.
Typy referencyjne i bezpośrednie
W większości języków programowania zmienne typów prymitywnych, takich jak typ
całkowity lub znakowy, tworzone są na stosie. Podczas przekazywania tych zmiennych,
ich wartości są kopiowane. Natomiast zmienne obiektowe zazwyczaj tworzone są na
stercie, a dostęp do nich jest możliwy przez referencje. To właśnie referencje, a nie same
obiekty, są kopiowane podczas przekazywania zmiennych obiektowych.
Typy w CLR dzieli się na dwie kategorie.
1. Typy bezpośrednie (ang. value type) typy pochodne od .
Zmienne tych typów przekazywane są przez wartość. Przechowywane są równie
efektywnie, jak zmienne prymitywne w innych językach programowania, ale
zarazem są to obiekty zawierające metody. Należy pamiętać, że nowe typy
bezpośrednie mogą być podtypami wyłącznie typu ,
nie innych typów bezpośrednich zdefiniowanych w przestrzeni nazw .
2. Typy referencyjne (ang. reference type) dobrze znane nam klasy, dostęp
do obiektów tych typów (klas) jest możliwy przez referencje stąd też ich nazwa.
Definiując nowe typy powinniśmy rozważyć, w jaki sposób będziemy korzystać
z obiektów tych typów i czy bardziej efektywne będzie przekazywanie ich przez
wartość, czy też przez referencję. W zależności od wyniku tych rozważań, możemy
zdefiniować je jako typ referencyjny lub bezpośredni.
4
Składowa taka nazywana jest składową chronioną (ang. protected member) przyp. tłum.
62 VIsuaI StudIo .NET: .NET Framework. Czarna ksIęga
Systemowe typy bezpośrednie, na przykład , są dokładnymi odpowiednikami
językowych typów prymitywnych. I tak, jest odpowiednikiem typu w języku C#
oraz typu w języku VB. Zawsze można użyć typu systemowego, jeżeli z jakiegoś
powodu nie chcemy zastosować jego odpowiednika w danym języku programowania.
Typy bezpośrednie, takie jak , zawsze przyprawiały projektantów obiek-
towych języków programowania o ból głowy. Kuszące jest posiadanie zunifikowanego
systemu typów, w którym każdy element jest obiektem, ale takie rozwiązanie rodzi je-
den istotny problem brak wydajności. Gdyby bowiem każda liczba całkowita (lub [ Pobierz całość w formacie PDF ]
zanotowane.pl doc.pisz.pl pdf.pisz.pl exclamation.htw.pl
może zawierać część . Część zwraca wartość właściwości, a część używana
jest do jej ustawienia. Specjalna zmienna o nazwie oznacza wartość przekazaną
podczas ustawiania właściwości. Mimo że właściwość implementowana jest jak meto-
da, to klient korzysta z niej jak z pola. Przykład:
Programiści znający VB natychmiast zauważą podobieństwo tej konstrukcji do kon-
strukcji i występujących w poprzednich wersjach VB. Na-
leży podkreślić, że właściwości takie mogą być w .NET użyte w każdym języku pro-
gramowania, również w C# i C++. Ponadto, z właściwości w klasie napisanej w jednym
z języków platformy .NET można korzystać w dowolnym innym języku tej platformy.
Właściwości nie muszą li tylko być używane do obsługi stanu obiektu, co stanowi fun-
damentalną różnicę między właściwościami a polami. Można, na przykład, zdefiniować
właściwość tylko do odczytu, która pobiera swoją wartość z bazy danych lub innego
zródła.
.NET został zaprojektowany do tworzenia aplikacji z graficznym interfejsem użytko-
wania i aplikacji dla sieci WWW. Krytycznym elementem takich aplikacji są zdarzenia
(ang. event) i ich obsługa. Z tego powodu Microsoft postanowił, że obsługa zdarzeń bę-
dzie częścią CLR. Klasa obsługująca zdarzenia może informować zainteresowanych
odbiorców, że zdarzenie zaszło. Tak więc odbiorcy mogą być subskrybentami interesu-
jących ich zdarzeń zdefiniowanych w klasie, która jest zródłem tych zdarzeń. Typowym
przykładem jest przycisk umieszczony na formularzu. Przycisk może zgłaszać zdarzenie
(przyciśnięto), a formularz może być subskrybentem tego zdarzenia. Ilekroć
przycisk zostaje przyciśnięty, formularz zostanie o tym poinformowany. Zdarzenia to
podstawowa technika przy tworzeniu graficznego interfejsu użytkownika, ale można z nich
korzystać w innych celach.
Modyfikatory klas
W tabeli 2.1 zawarto modyfikatory, którymi mogą być oznaczone klasy w .NET. Spo-
sób zapisu tych modyfikatorów jest różny w poszczególnych językach programowania.
W tabeli 2.2 znajdują się modyfikatory, które mogą mieć składowe klas.
TabeIa 2.1. Modyfikatory klas w środowisku .NET
ModyfIkator OpIs
Oznacza klasę, która nie może być klasą bazową.
Oznacza klasę implementującą jeden lub więcej interfejsów.
Oznacza klasę zawierającą jedną lub więcej metod abstrakcyjnych. Nie można tworzyć
obiektów klas abstrakcyjnych.
Oznacza klasę pochodną innej klasy.
Oznacza klasę widoczną na zewnątrz podzespołu.
Oznacza klasę niewidoczną na zewnątrz podzespołu.
RozdzIał 2. ModeI programowanIa w środowIsku .NET 61
TabeIa 2.2. Modyfikatory składowych klas w środowisku .NET
ModyfIkator OpIs
Metoda niemająca ciała jest metodą abstrakcyjną. Klasa zawierająca choć jedną metodę
abstrakcyjną jest klasą abstrakcyjną. Klasa pochodna klasy abstrakcyjnej musi zawierać
implementacje metod abstrakcyjnych.
, , Składowa oznaczona modyfikatorem jest dostępna tylko w klasie, w której jest
, zdefiniowana. Składowa oznaczona modyfikatorem jest powszechnie dostępna.
, Składowa oznaczona modyfikatorem dostępna jest w klasie, w której
jest zdefiniowana i w jej podklasach4. Składowa oznaczona modyfikatorem
jest dostępna w klasach zdefiniowanych w tym samym podzespole. Składowa oznaczona
modyfikatorem dostępna jest w podklasach i w klasach
zdefiniowanych w tym samym podzespole.
Składowa oznaczona modyfikatorem nie może być przesłonięta w podklasach.
Składowa oznaczona modyfikatorem przesłania składową odziedziczoną
po klasie bazowej.
Składowa oznaczona modyfikatorem jest częścią składową klasy, a nie
poszczególnych obiektów. Jest ona współdzielona przez wszystkie obiekty danej klasy.
Z takiej składowej można korzystać nawet wtedy, gdy nie istnieje żaden obiekt tej klasy.
Modyfikator używany jest do oznaczenia składowych o takich samych
nazwach, ale różniących się listą parametrów.
Składowa oznaczona modyfikatorem wywoływana jest za pomocą techniki
póznego wiązania. Wybór wywoływanej metody następuje na podstawie typu obiektu,
z którego metoda jest wywoływana, a nie na podstawie typu zmiennej referencyjnej,
za pośrednictwem której sięga się do obiektu.
Typy referencyjne i bezpośrednie
W większości języków programowania zmienne typów prymitywnych, takich jak typ
całkowity lub znakowy, tworzone są na stosie. Podczas przekazywania tych zmiennych,
ich wartości są kopiowane. Natomiast zmienne obiektowe zazwyczaj tworzone są na
stercie, a dostęp do nich jest możliwy przez referencje. To właśnie referencje, a nie same
obiekty, są kopiowane podczas przekazywania zmiennych obiektowych.
Typy w CLR dzieli się na dwie kategorie.
1. Typy bezpośrednie (ang. value type) typy pochodne od .
Zmienne tych typów przekazywane są przez wartość. Przechowywane są równie
efektywnie, jak zmienne prymitywne w innych językach programowania, ale
zarazem są to obiekty zawierające metody. Należy pamiętać, że nowe typy
bezpośrednie mogą być podtypami wyłącznie typu ,
nie innych typów bezpośrednich zdefiniowanych w przestrzeni nazw .
2. Typy referencyjne (ang. reference type) dobrze znane nam klasy, dostęp
do obiektów tych typów (klas) jest możliwy przez referencje stąd też ich nazwa.
Definiując nowe typy powinniśmy rozważyć, w jaki sposób będziemy korzystać
z obiektów tych typów i czy bardziej efektywne będzie przekazywanie ich przez
wartość, czy też przez referencję. W zależności od wyniku tych rozważań, możemy
zdefiniować je jako typ referencyjny lub bezpośredni.
4
Składowa taka nazywana jest składową chronioną (ang. protected member) przyp. tłum.
62 VIsuaI StudIo .NET: .NET Framework. Czarna ksIęga
Systemowe typy bezpośrednie, na przykład , są dokładnymi odpowiednikami
językowych typów prymitywnych. I tak, jest odpowiednikiem typu w języku C#
oraz typu w języku VB. Zawsze można użyć typu systemowego, jeżeli z jakiegoś
powodu nie chcemy zastosować jego odpowiednika w danym języku programowania.
Typy bezpośrednie, takie jak , zawsze przyprawiały projektantów obiek-
towych języków programowania o ból głowy. Kuszące jest posiadanie zunifikowanego
systemu typów, w którym każdy element jest obiektem, ale takie rozwiązanie rodzi je-
den istotny problem brak wydajności. Gdyby bowiem każda liczba całkowita (lub [ Pobierz całość w formacie PDF ]