background image

W.Kasprzak: JiMP3

6. Kontrola dostępu - kapsułkowanie

1

6. Kontrola dost

ę

pu -

kapsułkowanie

background image

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

background image

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

}

background image

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

{ ... }                    { ... }





background image

W.Kasprzak: JiMP3

6. Kontrola dostępu - kapsułkowanie

5

Deklaracja obszaru nazw



W obszarze nazw w C# moŜna definiować jedynie 

klasy

typy



Definicja obszaru nazw moŜe wystąpić

wielokrotnie 

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

background image

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( );

}

}





background image

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 { ... }

}

background image

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 { ... }

}

background image

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. 

background image

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

}                         

}

}                             









background image

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

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

background image

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

background image

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( );

}

}

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

W.Kasprzak: JiMP3

6. Kontrola dostępu - kapsułkowanie

20

Obszar nazw 

System.IO

Przykład współpracy z plikami:

background image

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

background image

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. 

background image

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ń.

background image

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 

==

!=

background image

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.