W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
1
6. Kontrola dost
ę
pu -
kapsułkowanie
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
2
Treść
1.
Obszar nazw
2.
Kwalifikatory dostępu
3.
Zestaw (assembly)
4.
Przykłady obszarów nazw w .NET
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
3
1. Obszary nazw
Zasięg widoczności
(zakres definicji) nazwy:
To taki zakres programu źródłowego (tekstu), w którym do nazwy
możemy odwoływać się w sposób prosty – bez kwalifikacji nazwy.
public class Bank
{
public class Rachunek
{
public void Wplata(decimal wartosc)
{
saldo
+= wartosc;
// Nazwy proste
}
private decimal saldo;
}
public Rachunek OtworzRachunek( ){...}
// Nazwa prosta
}
public class Bank
{
public class Rachunek
{
public void Wplata(decimal wartosc)
{
saldo
+=
wartosc
;
// Nazwy proste
}
private decimal saldo;
}
public
Rachunek
OtworzRachunek( ){...}
// Nazwa prosta
}
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
4
Konflikty nazw
W dużym programie liczącym tysiące nazw:
Pewne nazwy mogą się powtórzyć;
Ale nie chcemy stosować nazw kwalifikowanych dla
wszystkich klas;
Nie chcemy zmieniać raz nadanych nazw typów.
// Od producenta A
public class Widget public class ProdAWidget
{ ... } { ... }
// Od producenta B
public class Widget public class ProdBWidget
{ ... } { ... }
// Od producenta A
public class Widget public class ProdAWidget
{ ... } { ... }
// Od producenta B
public class Widget public class ProdBWidget
{ ... } { ... }
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
5
Deklaracja obszaru nazw
W obszarze nazw w C# można definiować jedynie
klasy
i
typy
Definicja obszaru nazw może wystąpić
wielokrotnie
w
programie (rozszerzalna postać definicji obszaru nazw).
Obszar nazw można
zagnieżdżać
w innym obszarze nazw.
Dostęp do obszaru nazw – jest zawsze
niejawnie publiczny
.
namespace
ProducentA
{
public class Widget
{ ... }
}
namespace
ProducentA
{
public class Widget
{ ... }
}
namespace
ProducentB
{
public class Widget
{ ... }
}
namespace
ProducentB
{
public class Widget
{ ... }
}
namespace
Producent
{
namespace Office
{
...
}
}
namespace
Producent
{
namespace Office
{
...
}
}
namespace
Producent.Office
{
}
namespace
Producent.Office
{
}
W C# możliwy jest skrót
W C# mo
W C# mo
ż
ż
liwy jest
liwy jest
s
s
kr
kr
ó
ó
t
t
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
6
W pełni kwalifikowane nazwy
W pełni
kwalifikowana
nazwa zawiera nazwę obszaru nazw
Niekwalifikowane
nazwy klas można stosować jedynie w ich
zasięgach widoczności.
namespace ProducentA
{
public class Widget { ... }
...
}
class Aplikacja
{
static void Main( )
{
Widget w = new Widget( );
// Bł
ą
d!
ProducentA.
Widget w= new ProducentA.Widget( );
}
}
namespace ProducentA
{
public class Widget { ... }
...
}
class Aplikacja
{
static void Main( )
{
Widget w = new Widget( );
// Bł
ą
d!
ProducentA.
Widget w= new ProducentA.Widget( );
}
}
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
7
Deklaracja
using-namespace
Taka deklaracja nadaje nazwom definiowanym w pewnym
obszarze nazw
widoczność w ramach aktualnego zasięgu
(
aktualny
to ten, w którym znajduje się instrukcja
using
).
Deklaracja
using
jeśli występuje to musi wystąpić
przed
deklaracjami
składowych danego zasięgu.
using ProducentA.ZestawB;
class Aplikacja
{
static void Main( )
{
Widget w = new Widget( );
}
}
using ProducentA.ZestawB;
class Aplikacja
{
static void Main( )
{
Widget w = new Widget( );
}
}
namespace ProducentA.ZestawB
{
public class Widget { ... }
}
namespace ProducentA.ZestawB
{
public class Widget { ... }
}
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
8
Deklaracja
using-alias
Tworzy
synonim nazwy
(jest to skrót kwalifikowanej nazwy,
zwykle głęboko zagnieżdżonej w obszarze nazw i klasie).
Deklaracja
using
jeśli występuje to musi wystąpić
przed
deklaracjami
składowych danego zasięgu.
using Widget = ProducentA.ZestawB.Widget;
class Aplikacja
{
static void Main( )
{
Widget w = new Widget( );
}
}
using Widget = ProducentA.ZestawB.Widget;
class Aplikacja
{
static void Main( )
{
Widget w = new Widget( );
}
}
namespace ProducentA.ZestawB
{
public class Widget { ... }
}
namespace ProducentA.ZestawB
{
public class Widget { ... }
}
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
9
2. Kwalifikatory dostępu
Kwalifikatory dostępu do klas i składowych klas (lub klas
zagnieżdżonych):
public
– klasa lub składowa dostępna ze wszystkich
innych klas.
protected
– składowa dostępna w swojej klasie i klasach
pochodnych tej klasy.
private
– składowa dostępna jedynie w swojej klasie.
internal
– obiekt klasy lub składowa dostępne w ramach
zestawu (assembly) do którego należy.
protected internal
– składowa obiektu dostępna w ramach
zestawu (assembly), do którego należy lub w klasach
dziedziczonych z klasy, do której składowa ta należy.
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
10
Dostęp chroniony
(protected)
do składowych
dziedziczonych
Dziedziczone składowe
chronione (protected)
są też
chronione w klasie pochodnej
Metody klasy pochodnej mają dostęp do tych składowych
dziedziczonych, które są
chronione
lub
publiczne (public).
Modyfikator dostępu do składowych
protected
nie może
występować w strukturze
struct
.
class Token
{ ... class Pomocnicza
protected
string name; {
} void Fails(Token t)
class CommentToken: Token {
{ ... ...
public string Name( ) t.name ...
// Tu
{ ...
// niedost
ę
pne!
return name;
// Tak - dost
ę
pne
}
}
}
}
class Token
{ ... class Pomocnicza
protected
string name; {
} void Fails(Token t)
class CommentToken: Token {
{ ... ...
public string Name( ) t.name ...
// Tu
{ ...
// niedost
ę
pne!
return name;
// Tak - dost
ę
pne
}
}
}
}
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
11
Wewnętrzny dostęp
(Internal)
Motywacja stosowania
wewnętrznego
dostępu
:
Podział programu na „
małe” obiekty
poprawia jego czytelność, ale takie obiekty nie
są samodzielne – muszą współpracować w
celu symulacji działania „większego” obiektu.
Wymagane jest ograniczenie dostępu do
grupy współpracujących obiektów
.
Poziomy dostępu
Publiczny
i
prywatny
dostęp to pojęcia
logiczne
(odnoszą się do samych
klas
).
Chroniony
dostęp również odnosi się do
klas
-
powiązanych relacją dziedziczenia.
Wewnętrzny dostęp
jest pojęciem
fizycznym
(odnosi się do
grupy obiektów
).
public
internal
private
internal
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
12
Składnia – dostęp wewnętrzny
Domyślnym dostępem do klasy niezagnieżdżonej jest
internal
(wewnętrzny)
.
Klasa niezagnieżdżona może być dostępna jedynie
publicznie
lub
wewnętrznie
.
Klasy zagnieżdżone i składowe klas mogą być dostępne na
pełne 5 sposobów.
internal
class <outername>
{ internal class <nestedname> { ... }
internal
<type> pole;
internal
<type> Metoda( ) { ... }
protected internal
class <nestedname> { ... }
protected internal
<type> pole;
protected internal
<type> Metoda( ) { ... }
}
internal
class <outername>
{ internal class <nestedname> { ... }
internal
<type> pole;
internal
<type> Metoda( ) { ... }
protected internal
class <nestedname> { ... }
protected internal
<type> pole;
protected internal
<type> Metoda( ) { ... }
}
protected internal oznacza: protected lub internal
protected internal
oznacza: protected
lub
internal
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
13
Przykład – dostęp wewnętrzny
public interface IBankAccount { ... }
internal
abstract class CommonBankAccount { ... }
internal
class DepositAccount: CommonBankAccount,
IBankAccount { ... }
public class Bank
{
public IBankAccount OpenAccount( )
{
return new DepositAccount( );
}
}
public interface IBankAccount { ... }
internal
abstract class CommonBankAccount { ... }
internal
class DepositAccount: CommonBankAccount,
IBankAccount { ... }
public class Bank
{
public IBankAccount OpenAccount( )
{
return new DepositAccount( );
}
}
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
14
3. Zestaw
(assembly)
Moduł a zestaw
Pliki źródłowe (*.cs) mogą być najpierw kompilowane
do postaci modułu (*.netmodule) – samodzielnej
jednostki zawierającej zarządzany w .NET kod :
Samodzielny moduł nie może być jeszcze dołączony do
wykonywalnego programu. Moduł musi być najpierw
dodany do jakiegoś
zestawu
.
Zestaw
jest z punktu widzenia logicznego (kompilatora)
biblioteką DLL
.
csc /target:module Bank.cs
csc /target:module Bank.cs
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
15
Zestawy
Zestaw
to jednostka programu, wielokrotnego użytku, z
możliwością
specyfikacji
wersji,
udostępniająca
opisy
zawartych w niej klas i obiektów.
Zestaw wyznacza wewnętrzny zakres dostępu
(internal)
dla
obiektów klas i składowych w nim zawartych:
Zestaw 4 klas z
niektórymi
składowymi o
dostępie
wewnętrznym
public
internal
private
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
16
Tworzenie zestawu
Tworzenie zestawu złożonego z jednego pliku
Tworzenie zestawu złożonego z wielu plików
Kod MSIL zestawu i jego manifest są bezpośrednio zawarte w pliku
zestawu.
Moduły i zasoby zestawu mogą być referowane w zestawie jako
zewnętrzne pliki.
Elementem identyfikacji zestawu jest numer wersji zestawu
przyjmujący format:
<major>.<minor>.<build number>.<revision>
csc /target:library /out:Bank.dll
Bank.cs Account.cs
csc /target:library /out:Bank.dll
Bank.cs Account.cs
csc /t:library /addmodule:Account.netmodule
/out:Bank.dll Bank.cs
csc /t:library /addmodule:Account.netmodule
/out:Bank.dll Bank.cs
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
17
Porównanie obszaru nazw i zestawu
Obszar nazw: logiczny mechanizm nazw
Klasy należące do jednego obszaru nazw mogą
wystąpić w wielu zestawach.
W jednym zestawie mogą wystąpić klasy należące do
wielu obszarów nazw.
Zestaw: fizyczny mechanizm grupujący obiekty
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
18
4. Przykłady obszarów nazw w
.NET
System.IO
System.Xml
System.Data
Inne użyteczne obszary nazw
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
19
Obszar nazw
System.IO
System.IO
zapewnia klasy dla dostępu do systemu plików:
File, Directory –
tworzenie, usuwanie plików i kartotek
StreamReader, StreamWriter –
odczyt/zapis znakowy
FileStream –
swobodny dostęp do pliku
BinaryReader, BinaryWriter –
odczyt/zapis bitowy wartości
podstawowych typów danych
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
20
Obszar nazw
System.IO
Przykład współpracy z plikami:
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
21
Obszar nazw
System.Xml
Zapewnia przetwarzanie dokumentów w
Extensible Markup
Language (XML)
Implementuje różne standardy przetwarzania XML
Podstawowe klasy
XmlDocument, XmlElement, XmlAttribute
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
22
Obszar nazw
System.Data
Wyznacza architekturę
ADO.NET
– zarządzania bazami danych w
środowisku rozproszonym:
Podstawowe klasy:
DataSet, DataTable
Obszar nazw
System.Data.SqlClient –
zapewnia dostęp do serwera
SQL.
Obszar nazw
System.Data.OleDb
– zapewnia dostąp do relacyjnych
baz danych OLEDB.
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
23
Inne użyteczne obszary nazw
System.Net
– zapewnia programowy interfejs do większości
protokołów sieciowych
System.Net.Sockets
– stanowi implementację narzędzi dostępu do
protokołu TCP / IP
System.Windows.Forms
–
podstawa graficznego interfejsu
użytkownika dla aplikacji okienkowych, umożliwiając tworzenie
formatek, kontrolek i obsługę zdarzeń.
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
24
Informacja o dynamicznym typie („RTTI, reflection”)
Można sprawdzać typ obiektu – umożliwiają to klasy w obszarze nazw
System.Reflection
.
Klasa
System.Type
umożliwia reprezentowanie informacji o klasie – o
jej konstruktorach, metodach, własnościach, polach i zdarzeniach.
Obiekt klasy
Type
jest unikalny dla każdego typu. Można porównywać
dwa obiekty tej klasy, aby sprawdzić zachodzenie zgodności typu
obiektu z oczekiwanym typem (operatorami
==
,
!=
)
W.Kasprzak: JiMP3
6. Kontrola dostępu - kapsułkowanie
25
Informacja o dynamicznym typie („RTTI, reflection”)
Operator
typeof
zwraca informację RTTI w postaci obiektu typu
Type
, ale można go wywołać jedynie dla klas znanych podczas
kompilacji – parametrem może być jedynie nazwa klasy, a nie
wyrażenie lub obiekt.
Metoda
GetType
w klasie
System.Object –
zwraca informację czasu
wykonania o dynamicznym typie dla identyfikatora obiektu.