SlideShare a Scribd company logo
1 of 37
Download to read offline
IDZ DO
         PRZYK£ADOWY ROZDZIA£

                           SPIS TRE CI   C# i ASP.NET. Szybki start
                                         Autor: Jose Mojica
           KATALOG KSI¥¯EK               T³umaczenie: Wojciech Moch (rozdz. 1 - 6),
                                         Rados³aw Meryk (rozdz. 7 - 13)
                                         ISBN: 83-7361-389-7
                      KATALOG ONLINE     Tytu³ orygina³u: C# Web Development with ASP.NET:
                                         Visual QuickStart Guide
       ZAMÓW DRUKOWANY KATALOG           Format: B5, stron: 456
                                         Przyk³ady na ftp: 1127 kB
              TWÓJ KOSZYK
                    DODAJ DO KOSZYKA     C# to ca³kiem nowy jêzyk programowania zaprojektowany przez firmê Microsoft.
                                         Wygl¹da on jak mieszanka C++ i Javy, jest jednak tak prosty jak Visual Basic.
                                         Z jego pomoc¹ mo¿na tworzyæ aplikacje WWW i programy wyposa¿one w graficzny
         CENNIK I INFORMACJE             interfejs u¿ytkownika. Jêzyk ten zwi¹zany jest z platform¹ .NET, umo¿liwiaj¹c¹
                                         tworzenie zaawansowanych aplikacji biznesowych dzia³aj¹cych w rodowisku
                   ZAMÓW INFORMACJE      sieciowym, w tym tak¿e z technologi¹ budowania dynamicznych serwisów
                     O NOWO CIACH        internetowych ASP.NET. Programy dzia³aj¹ce na platformie .NET mo¿na pisaæ
                                         w wielu jêzykach programowania, ale wiele wskazuje na to, ¿e w³a nie C# stanie siê
                       ZAMÓW CENNIK      najpopularniejszym z nich.
                                         Ksi¹¿ka „C# i ASP.NET. Szybki start” jest doskona³ym podrêcznikiem dla
                                         pocz¹tkuj¹cych programistów. Jak ka¿da pozycja z serii „Szybki start”, sk³ada siê
                 CZYTELNIA               z kilkudziesiêciu rozdzia³ów, z których ka¿dy przedstawia kolejne kroki, które nale¿y
                                         wykonaæ, by osi¹gn¹æ zamierzony cel. Dodatkow¹ zaletê stanowi¹ liczne ilustracje.
          FRAGMENTY KSI¥¯EK ONLINE       Opisano miêdzy innymi:
                                            • Instalacjê niezbêdnego oprogramowania
                                            • Sk³adniki jêzyka C#
                                            • Instrukcje warunkowe i pêtle
                                            • Pracê z ci¹gami znaków
                                            • Programowanie obiektowe w C#
                                            • Korzystanie z tablic i kolekcji
                                            • Delegaty, zdarzenie, obs³ugê b³êdów
                                            • Tworzenie dynamicznych serwisów WWW w jêzyku C#
                                         Programista chc¹cy tworzyæ zaawansowane aplikacje internetowe ma wybór pomiêdzy
                                         dwoma platformami: Java 2 EE Suna i .NET Microsoftu. Je li wybierze tê drug¹, dziêki
Wydawnictwo Helion                       ksi¹¿ce „C# i ASP.NET. Szybki start” szybko bêdzie móg³ tworzyæ funkcjonalne
ul. Chopina 6
                                         aplikacje WWW w nowym, ekscytuj¹cym jêzyku C#.
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Spis treści



                                                                               Spis treści

              Wstęp                                                                                                 11
Rozdział 1.   Zaczynamy                                                                                                23
              Jak zdobyć C# ...........................................................................................24
              Instalowanie IIS.........................................................................................26
              Tworzenie projektu aplikacji sieciowej w Visual Studio .NET ................28
              Uruchamianie projektów sieciowych za pomocą Visual Studio .NET........ 31
              Pisanie prostej strony ASP .NET ..............................................................33
              Wyszukiwanie błędów w aplikacjach ASP .NET .....................................35
              Ręczne uruchamianie kompilatora ............................................................38
              Kompilowanie i uruchamianie programów C# bez pomocy VS.NET ........ 39
              Wyszukiwanie błędów w programach bez pomocy VS.NET ...................41




                                                                                                                            Spis treści
Rozdział 2.   Składniki języka C#                                                                                     43
              Praca z elementami języka ........................................................................44
              Pisanie kodu C#.........................................................................................48
              Deklarowanie zmiennych ..........................................................................50
              Definiowanie stałych.................................................................................53
              Grupowanie stałych w typy wyliczeniowe................................................54
              Deklarowanie funkcji ................................................................................56
              Deklarowanie funkcji z parametrami ........................................................58
              Zwracanie wartości funkcji .......................................................................62
              Definiowanie klas......................................................................................64
              Dodawanie klas do przykładowej aplikacji...............................................67
              Tworzenie i stosowanie obiektów .............................................................68
              Tworzenie obiektów w przykładowej aplikacji.........................................70
              Włączanie definicji klas ze źródeł zewnętrznych......................................71
              Grupowanie klas w przestrzeniach nazw ..................................................74
              Dodawanie pól do klas ..............................................................................78
              Inicjalizowanie pól w momencie ich deklarowania ...................................79
              Dodawanie właściwości do klas................................................................80

                                                                                                                       5
Spis treści

                            Dodawanie metod do klasy .......................................................................86
                            Dodawanie składowych do klas przykładowego programu ......................89
                            Uruchamianie przykładowej aplikacji.......................................................90
                            Dodawanie komentarzy.............................................................................95
                            Kierunki parametrów w typach referencyjnych ........................................97
              Rozdział 3.   Wyrażenia warunkowe i pętle                                                                           99
                            Praca z pętlami i warunkami ...................................................................100
                            Porównywanie typów numerycznych .....................................................104
                            Porównywanie typów referencyjnych .....................................................105
                            Łączenie porównań .................................................................................109
                            Instrukcje warunkowe .............................................................................110
                            Sprawdzanie wielu warunków za pomocą instrukcji switch ...................112
                            Operator warunku....................................................................................114
                            Dodawanie instrukcji warunkowych do przykładowego programu ........115
                            Stosowanie pętli while ............................................................................122
                            Stosowanie pętli do .................................................................................123
Spis treści




                            Stosowanie pętli for.................................................................................124
                            Zakończenie i kontynuacja pętli..............................................................126
                            Dodawanie pętli do przykładowego programu........................................129
              Rozdział 4.   Ciągi znaków                                                                                          133
                            Przygotowanie komputera do pracy z ciągami znaków ..........................135
                            Praca z ciągami znaków ..........................................................................137
                            Inicjalizowanie ciągów znaków ..............................................................140
                            Porównywanie ciągów znaków ...............................................................142
                            Łączenie ciągów znaków.........................................................................145
                            Określanie długości ciągu znaków ..........................................................147
                            Porównywanie i łączenie ciągów znaków w przykładowej aplikacji........ 148
                            Tworzenie ciągów z pojedynczych znaków ............................................151
                            Znaki specjalne........................................................................................154
                            Stosowanie ciągów literałów...................................................................156
                            Dostęp do poszczególnych znaków ciągu ...............................................158
                            Wyszukiwanie podciągów wewnątrz ciągów znaków ............................159
                            Pobieranie wycinka ciągu........................................................................160
                            Dzielenie ciągu znaków...........................................................................161
                            Składanie ciągów.....................................................................................163

              6
Spis treści

              Zamiana liter na małe lub wielkie ...........................................................164
              Formatowanie ciągów znaków................................................................165
              Uruchomienie przykładowej aplikacji.....................................................166
              Zamiana obiektów na ciągi znaków ........................................................171
              Tworzenie ciągów znaków za pomocą klasy StringBuilder .....................172
Rozdział 5.   Dziedziczenie klas                                                                               173
              Praca z dziedziczeniem klas ....................................................................174
              Dziedziczenie z innej klasy .....................................................................177
              Udostępnianie składowych klas i ograniczanie dostępu do nich.............180
              Rozbudowa przykładowej aplikacji ........................................................183
              Ukrywanie metod klasy bazowej ............................................................188
              Pokrywanie funkcji w klasie wywiedzionej ............................................190
              Dodawanie standardowego klawisza do przykładowej aplikacji ............194
              Stosowanie nowego klawisza na formularzu WorkOrder .......................197
              Dodawanie funkcji, które muszą zostać pokryte.....................................200
              Wymóg dziedziczenia .............................................................................201




                                                                                                                         Spis treści
              Blokowanie dziedziczenia.......................................................................202
Rozdział 6.   Składowe specjalne                                                                               203
              Dodawanie wielu funkcji o takich samych nazwach,
              czyli przecią anie funkcji........................................................................204
              Definiowane funkcji o zmiennej liczbie parametrów .................................207
              Dodawanie konstruktorów ......................................................................209
              Wywoływanie konstruktora klasy bazowej.............................................210
              Dodawanie finalizerów ...........................................................................212
              Tworzenie bibliotek kodu za pomocą składowych statycznych..............213
              Zmiana znaczenia operatora (przecią anie operatorów) .........................216
              Definiowanie równowa ności klas przez przecią enie
              operatora równości ..................................................................................220
              Definiowanie równowa ności klas przez pokrycie funkcji Equals .........222
              Praca ze składowymi specjalnymi...........................................................224
Rozdział 7.   Typy                                                                                             229
              Działania z typami...................................................................................230
              Uzyskiwanie typu klasy ..........................................................................234
              Sprawdzanie zgodności typów ................................................................236

                                                                                                                    7
Spis treści

                            Konwersja jednego typu na inny .............................................................237
                            Rozwinięcie przykładowej aplikacji .......................................................240
                            Definiowanie reguł konwersji (przecią anie operatora konwersji) ........... 246
              Rozdział 8.   Interfejsy                                                                                         249
                            Działania z interfejsami...........................................................................251
                            Definiowanie interfejsów ........................................................................255
                            Niejawna implementacja składowych interfejsu .....................................257
                            Jawna implementacja składowych interfejsu ..........................................260
                            Usprawnianie przykładowej aplikacji .....................................................261
                            Wykorzystanie obiektów poprzez interfejsy ...........................................268
                            Rozpoznawanie interfejsu .......................................................................269
                            Wykorzystanie interfejsów do polimorfizmu..........................................271
                            Interfejs będący pochodną innego interfejsu...........................................272
                            Refaktoryzacja.........................................................................................274
                            Ponowna implementacja interfejsów w klasie pochodnej.......................275
                            Kończymy przykładową aplikację ..........................................................277
Spis treści




              Rozdział 9.   Tablice i kolekcje                                                                                 279
                            Działania z tablicami i kolekcjami ..........................................................281
                            Tworzenie tablic wartości .......................................................................285
                            Tworzenie tablic typów referencyjnych ..................................................287
                            Poruszanie się po tablicy .........................................................................291
                            Inicjowanie elementów tablicy w miejscu ..............................................294
                            Tworzenie tablic wielowymiarowych .....................................................296
                            Usprawnianie przykładowej aplikacji .....................................................298
                            Odnajdywanie elementów tablicy
                            za pomocą wyszukiwania liniowego.......................................................... 301
                            Sortowanie tablic.....................................................................................304
                            Odnajdywanie elementów tablicy
                            za pomocą wyszukiwania binarnego.......................................................... 307
                            Klasy działające jak tablice (definiowanie indeksatorów) ......................309
                            Wprowadzenie indeksatorów do przykładowej aplikacji........................312
                            Kopiowanie tablic ...................................................................................313
                            Tworzenie list dynamicznych..................................................................314
                            Tworzenie kolejek ...................................................................................316


              8
Spis treści

            Tworzenie stosów....................................................................................317
            Tworzenie tabel mieszających.................................................................318
            Przeglądanie elementów tabel mieszających...........................................320
            Kończymy przykładową aplikację ..........................................................321
            Testowanie kontrolki CodeGridWeb.......................................................323
Rozdział 10. Delegaty i zdarzenia                                                                           325
            Działania z delegatami i zdarzeniami......................................................327
            Deklarowanie delegatów .........................................................................330
            Tworzenie i wywoływanie delegatów .....................................................331
            Łączenie delegatów .................................................................................333
            Odłączanie delegatów .............................................................................334
            Deklarowanie i wyzwalanie zdarzeń .......................................................336
            Deklarowanie zdarzeń przyjaznych dla WWW ......................................338
            Subskrypcja zdarzeń................................................................................340
            Asynchroniczne wyzwalanie delegatów .................................................342
            Oczekiwanie na zakończenie działania delegatów asynchronicznych ...... 346




                                                                                                                      Spis treści
            Pobieranie wyników działania delegatów asynchronicznych .................348
            Kończymy przykładową aplikację ..........................................................350
Rozdział 11. Obsługa błędów                                                                                 353
            Wykonywanie działań z wyjątkami ........................................................354
            Przechwytywanie wyjątków....................................................................360
            Przechwytywanie wybranych wyjątków .................................................363
            Uzyskiwanie informacji o wyjątku..........................................................366
            Działania z łańcuchami wyjątków...........................................................368
            Deklarowanie własnych wyjątków..........................................................372
            Definiowanie komunikatów o błędach....................................................374
            Zgłaszanie wyjątku..................................................................................375
            Przechwytywanie i ponowne zgłaszanie wyjątków ................................376
            Tworzenie łańcucha wyjątków................................................................377
            Wprowadzanie kodu,
            który wykonuje się przed zakończeniem działania funkcji.....................378
            Zastosowanie słowa kluczowego using...................................................380
            Wprowadzanie zabezpieczeń formularzy do przykładowej aplikacji........ 382
            Obsługa nieobsłu onych błędów w aplikacjach WWW .........................385


                                                                                                                 9
Spis treści

              Rozdział 12. Odbicia i atrybuty                                                                               389
                           Działania z odbiciami i atrybutami .........................................................390
                           Identyfikacja kompilata...........................................................................394
                           Działania z wyświetlanymi nazwami ......................................................395
                           Działania z ciągami znaków opisu ście ek .............................................398
                           Dynamiczne ładowanie programu na podstawie nazwy wyświetlanej...... 399
                           Dynamiczne ładowanie programu na podstawie ście ki dostępu ...........400
                           Tworzenie egzemplarza klasy w kompilacie...........................................401
                           Uzyskiwanie listy klas w kompilacie ......................................................403
                           Wyszczególnienie składowych klasy ......................................................404
                           Dynamiczne ustawianie lub pobieranie pól.............................................406
                           Dynamiczne wywoływanie metody ........................................................409
                           Kończymy zadanie pierwsze w przykładowej aplikacji..........................411
                           Stosowanie atrybutów kodu ....................................................................413
                           Definiowanie atrybutów ..........................................................................414
                           Wyszukiwanie atrybutów w kodzie ........................................................417
                           Kończymy zadanie drugie w przykładowej aplikacji..............................420
Spis treści




              Rozdział 13. Projekty WWW w języku C#                                                                 423
                           Tworzenie projektu DLL za pomocą Visual Studio .NET ......................424
                           Odwoływanie się do kodu DLL i jego wykonywanie .............................428
                           Udostępnianie bibliotek DLL do globalnego wykorzystania ..................429
                           Tworzenie serwisów WWW ...................................................................432
                           Wykorzystywanie serwisów WWW .......................................................436
                                 Skorowidz                                                                                439




              10
Interfejsy



    Interfejsy
                                                 Interfejsy




Interfejsy to typy pozwalające na definiowanie
wielu klas spełniających podobne funkcje.
Wyobraźmy sobie klasę 'UEQTV. W klasie 'UEQTV
są takie metody, jak: ,CFC, <CVT[OCPKG,
1FVYCTCPKG/W[MK itp. U ytkownik jest
zadowolony z klasy 'UEQTV, poniewa umo liwia
mu ona dojazdy do pracy i z powrotem. W pewnym
momencie jego koledzy zaczęli jednak artować
z klasy 'UEQTV, dlatego postanowił zastąpić ją
klasą (GTTCTK. Przed zastąpieniem klasy 'UEQTV
klasą (GTTCTK u ytkownik chce mieć jednak
pewność, e klasa ta spełnia co najmniej takie
same funkcje, co klasa Escort. Musi więc
oferować metody ,CFC, <CVT[OCPKG,
1FVYCTCPKG/W[MK. Wszystkie te działania mogą
być wykonywane inaczej ni w klasie 'UEQTV,




                                                              Interfejsy
ale wa ne jest, aby istniały co najmniej takie
same metody. Ich zestaw nazywa się interfejsem.
Interfejs mo e np. nosić nazwę +5COQEJQF.
Wszystkie samochody, aby mogły być tak
nazywane, będą musiały zawierać implementację
interfejsu +5COQEJQF (przynajmniej z naszego
punktu widzenia).
W świecie, w którym yjemy, obowiązują zasady
interfejsów. Implementacjami podobnych
interfejsów są, na przykład, .WFKG. Wielu z nas
oddycha i je (jeśli ktoś się z tym nie zgadza,
proszę natychmiast przestać czytać tę ksią kę).
Ka dy egzemplarz klasy .WFKG mo e w inny
sposób oddychać lub jeść, ale, niezale nie od tego,
takie firmy, jak np. McDonald będą mogły odnosić
sukcesy tylko wtedy, gdy zostanie wykonana
metoda ,GFGPKG nale ąca do interfejsu +%NQYKGM.




                                              249
Rozdział 8.

             W terminologii języka C# interfejsy są typami.
             W stosunku do definicji interfejsów w języku C++
             ró nią się tym, e nie są to wyspecjalizowane
             klasy. Są to natomiast oddzielne typy. Zgodnie
             z podstawową definicją, interfejs jest zbiorem
             definicji funkcji (tylko definicji, bez kodu
             implementacji). Funkcje te same w sobie nie
             wykonują adnych działań. Przypominają
             interfejs +%NQYKGM bez konkretnego egzemplarza
             człowieka — to tylko pojęcie, a nie rzeczywista
             implementacja. Aby mo na było skorzystać
             z interfejsu, nale y go zaimplementować
             w obrębie klasy. Kiedy klasa implementuje
             interfejs, ogłasza wszem i wobec, e obsługuje
             wszystkie zdefiniowane w nim metody. Je eli
             sprzedawca u ywanych samochodów twierdzi,
              e jego towar jest implementacją interfejsu
             +5COQEJQF, to tak samo, jakby mówił, e zawiera
             co najmniej metody: ,CFC, <CVT[OCPKG,
             1FVYCTCPKG/W[MK. Je eli któraś z metod
             interfejsu nie zostanie zaimplementowana,
             kompilator języka C# zgłosi błąd.
Interfejsy




             Zastosowanie interfejsów pozwala programistom
             pisać kod wykorzystujący funkcje i nie martwić
             się ich implementacją. Dzięki temu mo na
             rozpocząć od jakiejś implementacji, a potem
             całkowicie ją zastąpić bez konieczności
             przepisywania kodu. Sprawdza się to w przypadku
             interfejsu +5COQEJQF. Kierowcy nie uczą się
             prowadzenia konkretnego samochodu — uczą się
             prowadzić dowolny samochód, poniewa wszystkie
             samochody realizują ten sam, podstawowy interfejs.
             Posłu my się, jako przykładem rzeczywistego
             zastosowania interfejsów, technologią ADO .NET,
             która pozwala na realizację połączenia z bazą
             danych. Firma Microsoft, mo na w to wierzyć
             lub nie, nie ma zamiaru wymuszać u ycia tylko
             jednej bazy danych. Zamiast zmuszać do u ycia
             tego samego zestawu klas, zdefiniowała interfejs
             funkcji umo liwiających zrealizowanie połączenia
             z bazą danych. Producenci baz danych mają więc
             mo liwość napisania klas będących implementacją
             tego interfejsu. Idea kodowania z wykorzystaniem
             interfejsów polega na tym, e mo na zmienić
             wykorzystywany pakiet bazy danych bez
             konieczności przepisywania aplikacji.


             250
Interfejsy


Działania z interfejsami
Jako przykładową aplikację w tym rozdziale
napiszemy moduł ASP .NET. Nie będzie
to aplikacja bardzo rozbudowana, ale za to będzie
ją mo na wykorzystać w rzeczywistych
aplikacjach (w tym rozdziale nie będzie aplikacji
dotyczącej supermenów).
A zatem, czym jest moduł ASP .NET?
Moduł jest klasą, która mo e przechwytywać
 ądania dowolnych stron w aplikacji. Moduły
wykorzystuje się do wykonywania takich
działań, jak np. testy zabezpieczeń. Mogą one
przechwycić ka de ądanie i albo je zatrzymać,
albo kontynuować lub te zmodyfikować
w pewien sposób. Moduły mogą tak e
wykonywać działania po obsłudze ądania
przez odpowiednią stronę. Programistom




                                                     Działania z interfejsami
doświadczonym w programowaniu aplikacji
WWW z pewnością pomo e wyjaśnienie,
 e moduły są odpowiednikiem filtrów IIS
w środowisku .NET.
Celem modułu, który utworzymy, będzie
dostarczenie wszystkim stronom informacji
o rozmiarach obszaru klienta w przeglądarce.
Obszar klienta w przeglądarce to miejsce,
w którym jest wyświetlana strona WWW
(wewnątrz okna przeglądarki, bez pasków menu
i stanu). Interesujące, e środowisko .NET nie
przekazuje tych wymiarów za pośrednictwem
  adnej z właściwości. Mo na jednak uzyskać
te wielkości za pomocą skryptów działających
po stronie serwera (VBScript lub JavaScript
działające na komputerze-kliencie, a nie na
serwerze tak, jak strony ASP). Mo na zapytać,
dlaczego interesują nas te wymiary? Otó są
nam potrzebne, poniewa czasami chcemy
zastosować grafikę o mniejszych wymiarach,
jeśli wymiary okna są mniejsze lub większych
wymiarach, jeśli wymiary okna są większe.




                                             251
Rozdział 8.

                           Rozwiązanie problemu jest następujące. Kiedy
                           klient za ąda strony po raz pierwszy, moduł
                           zatrzyma ądanie i zwróci stronę z odpowiednim
                           skryptem działającym po stronie klienta.
                           Zadaniem skryptu będzie określenie wymiarów
                           obszaru klienta. Skrypt zapisze wymiary
                           w ukrytym polu, a następnie za ąda natychmiast
                           tej samej strony, której klient ądał poprzednio.
                           Wysłanie skryptu działającego po stronie klienta
                           i zwrócenie pierwotnie ądanej strony powinno
                           nastąpić na tyle szybko, aby u ytkownik niczego
                           nie zauwa ył. Za drugim razem, gdy moduł
                           otrzyma ądanie tej samej strony (teraz za ąda      Rysunek 8.1. Do utworzenia modułu potrzebny jest
                           jej skrypt działający po stronie klienta),         tylko projekt biblioteki, a nie cały projekt WWW
                           moduł odnajdzie ukryte pola zawierające            ASP .NET. Jednak utworzenie projektu WWW
                           wymiary, utworzy niewielki obiekt słu ący          ASP .NET pozwala na napisanie i przetestowanie
                           do przechowywania potrzebnych informacji           modułu w jednym projekcie
                           i przeka e je do ądanej strony. Strona pobierze
                           obiekt z informacjami i zwróci wynik do klienta,
Działania z interfejsami




                           który wykorzysta informacje o rozmiarze obszaru
                           klienta. W naszym przypadku na stronie wymiary
                           wyświetlone zostaną w polach tekstowych.

                           Aby napisać moduł:
                           1. Uruchom Visual Studio .NET (Start/
                              Programy/Microsoft Visual Studio .NET).
                           2. Wybierz polecenie File/New/Project.
                              Na ekranie pojawi się okno dialogowe
                              New Project.
                           3. W panelu Project Types po lewej stronie
                              okna New Project kliknij folder Visual C#
                              projects.
                           4. Zaznacz ikonę ASP .NET Web Application
                              i zmień nazwę aplikacji na interfacesproject
                              (rysunek 8.1).
                           5. Program Visual Studio utworzy nowy projekt
                              i otworzy formularz WebForm1.aspx.
                           6. Zmień nazwę formularza na dimensions.aspx.
                              W tym celu wybierz polecenie View/Solution
                              Explorer z górnego paska menu.




                           252
Interfejsy

                                                    7. Kliknij prawym klawiszem myszy formularz
                                                      dimensions.aspx i wybierz polecenie
                                                      Properties. W tabelce właściwości,
                                                      pokazanej poni ej na rysunku 8.2, zmień
                                                      właściwość FileName z WebForm1.aspx
                                                      na dimensions.aspx.
                                                    8. Zmodyfikuj formularz dimension.aspx
                                                      w taki sposób, aby wyglądał tak, jak formularz
                                                      pokazany na rysunku 8.3. Oczywiście,
                                                      w ręczne wykonanie tego zadanie trzeba
                                                      wło yć wiele pracy. Zamiast tego mo esz
                                                      wprowadzić kod HTML bezpośrednio
                                                      w edytorze. Na rysunku 8.4, na następnej
                                                      stronie, zaprezentowano kod HTML niezbędny
                                                      do utworzenia formularza. Aby bezpośrednio
                                                      wprowadzić kod HTML, kliknij przycisk
                                                      HTML w oknie edytora. Alternatywnie
                                                      mo esz pobrać plik szkieletu dla tego projektu




                                                                                                       Działania z interfejsami
                                                      (patrz „Wskazówki” na następnej stronie).
Rysunek 8.2. Zmiana nazwy pliku nie powinna
sprawiać teraz adnych problemów




Rysunek 8.3. Bardzo prosty formularz, który łatwo
utworzyć od nowa. Zawiera dwie etykiety, dwa pola
tekstowe oraz jedno łącze




                                                                                               253
Rozdział 8.

                           Wskazówki                                         Rysunek 8.4. Kod HTML pokazany na tym rysunku
                                                                             mo na wykorzystać jako wzorzec. Dzięki formularzowi
                              To, co do tej pory zrobiliśmy w przykładowej   mo liwe jest uzyskanie informacji o wymiarach
                              aplikacji, nie ma nic wspólnego z modułem      i pozycji wszystkich elementów sterujących
                              u ytkownika. Formularz projektowany
                              w tym podrozdziale zostanie u yty                 2CIG NCPIWCIG  E
                              do przetestowania modułu. Kod modułu            %QFGDGJKPF  FKOGPUKQPUCURZEU
                              zostanie dodany natychmiast po tym, jak                 #WVQ'XGPV9KTGWR HCNUG
                              dowiemy się czegoś na temat implementacji               +PJGTKVU 
                              interfejsów.                                     KPVGTHCEGURTQLGEV9GD(QTO
                                                                              *6/.
                              Podobnie jak w przypadku innych projektów           *'#
                              w tej ksią ce, utworzenie projektu nie                  VKVNG 9GD(QTOVKVNG
                              jest konieczne do poznania pojęć                    *'#
                                                                                  DQF[ /5A215+6+10+0) )TKF.C[QWV
                              zaprezentowanych w niniejszym rozdziale.                HQTO KF (QTO OGVJQF  RQUV
                              Szkielety wszystkich projektów mo na                    TWPCV UGTXGT
                                                                                          CURNCDGN KF NDN9KFVJ
                              pobrać z witryny WWW Wydawnictwa                                UV[NG +0':  .'(6
                              Peachpit pod adresem http://www.peachpit.                       RZ
                              com/vqs/csharp.                                                 215+6+10 CDUQNWVG 612 RZ
Działania z interfejsami




                                                                                              TWPCV UGTXGT
                                                                                              5GTQMQ è
                                                                                         CURNCDGN
                                                                                          CURNCDGN KF NDN*GKIJV
                                                                                              UV[NG +0':  .'(6
                                                                                              RZ
                                                                                              215+6+10 CDUQNWVG 612 RZ
                                                                                              TWPCV UGTXGT
                                                                                              9[UQMQ è
                                                                                         CURNCDGN
                                                                                          CURVGZVDQZ KF VZV9KFVJ
                                                                                              UV[NG +0':  .'(6
                                                                                              RZ
                                                                                              215+6+10 CDUQNWVG 612 RZ
                                                                                              TWPCV UGTXGT
                                                                                         CURVGZVDQZ
                                                                                          CURVGZVDQZ KF VZV*GKIJV
                                                                                              UV[NG +0':  .'(6
                                                                                              RZ
                                                                                              215+6+10 CDUQNWVG 612 RZ
                                                                                              TWPCV UGTXGT
                                                                                         CURVGZVDQZ
                                                                                          CURJ[RGTNKPM KF NPM5GNH
                                                                                              UV[NG +0':  .'(6
                                                                                              RZ
                                                                                              215+6+10 CDUQNWVG 612 RZ
                                                                                              TWPCV UGTXGT
                                                                                              0CXKICVG7TN FKOGPUKQPUCURZ
                                                                                              1F YKG
                                                                                          CURJ[RGTNKPM
                                                                                      HQTO
                                                                                  DQF[
                                                                              *6/.




                           254
Interfejsy

 Tabela 8.1. Składowe interfejsu (składowe, które
 mo na wprowadzić do definicji interfejsu)
                                                       Definiowanie interfejsów
 Nazwa                     Przykład                    Interfejsy definiuje się za pomocą słowa
 Metoda                    UVTKPI /GVJQF
            kluczowego KPVGTHCEG. Dla interfejsów mo na
 Właściwość                KPV #IG] IGV UGV_          definiować metody, właściwości, delegaty,
 Właściwość tylko          KPV #IG]IGV_
                                                       zdarzenia itp. Ka dy z elementów wewnątrz
 do odczytu                                            interfejsu musi być jednak tylko deklaracją
 Indeks                    NQPI VJKU=KPV               elementu i nie mo e zawierać implementacji.
                           KPFGZ?]IGV UGV_
 Zdarzenie                 GXGPV 'XGPV*CPFNGT          Aby zdefiniować interfejs:
                           1P%NKEM
                                                       1. Wpisz słowo kluczowe RWDNKE lub KPVGTPCN,
                                                          w zale ności od zasięgu, jaki ma mieć
                                                          interfejs.
Rysunek 8.5. Składowe interfejsu to tylko definicje,
które nie zawierają kodu. W definicjach nie stosuje    2. Wprowadź słowo kluczowe KPVGTHCEG,
się tak e modyfikatorów dostępu — wszystkie               a po nim spację.
metody interfejsu są publiczne
                                                       3. Wpisz nazwę interfejsu.
                                                       4. Otwórz nawias klamrowy ].




                                                                                                          Definiowanie interfejsów
 RWDNKE KPVGTHCEG +*WOCP
 ]                                                     5. Wprowadź definicje składowych (tabela 8.1).
    UVTKPI 0COG ] IGV _ właściwość tylko
                           do odczytu                6. Zamknij nawias klamrowy _ (rysunek 8.5).
    XQKF 'CV
KPV #OQWPV metoda
    XQKF $TGCVJG
       metoda
 _




                                                                                                  255
Rozdział 8.

                           Wskazówki                                          Rysunek 8.6. Po zdefiniowaniu interfejsu mo na
                                                                              go wykorzystać jako typ danych w deklaracjach
                              Wszystkie metody interfejsu z definicji są      zmiennych lub parametrów
                              publiczne — w definicji metody nie mo na
                              wprowadzić modyfikatorów dostępu
                                                                               ENCUU CKN[4QWVKPG
                              (dotyczy to tak e modyfikatora RWDNKE).          ]
                              Danych typu interfejsu mo na u yć                    XQKF 6CUMU

                                                                                   ]
                              w definicjach parametrów lub zmiennych                   +*WOCP OCP
                              (rysunek 8.6). W przypadku interfejsów                   +*WOCP YQOCP
                              nie mo na jednak tworzyć nowych                      _
                              egzemplarzy — na przykład nie mo na
                              napisać PGY +#EEQWPV.                                RWDNKE XQKF )Q6QKPPGT
+*WOCP RGTUQP
                                                                                   ]
                              W interfejsach mo na przecią ać metody                   RGTUQP 'CV

                              (rysunek 8.7).                                       _
                                                                               _
                              Je eli jakiś programista u yje interfejsu,
                              najlepiej nie zmieniać jego definicji.          Rysunek 8.7. Przecią anie metod to mo liwość
                              W przeciwnym razie istnieje ryzyko,             istnienia kilku metod o tej samej nazwie.
Definiowanie interfejsów




                               e napisany program przestanie działać.         Pamiętaj, e mo na to zrobić tylko pod warunkiem,
                              W takiej sytuacji najlepiej zdefiniować nowy     e zmieni się liczbę parametrów lub zmodyfikuje
                              interfejs. Więcej informacji na ten temat       typ jednego z nich
                              znajdzie się w dalszej części tego rozdziału,
                              w podrozdziale „Tworzenie interfejsów            RWDNKE KPVGTHCEG +*WOCP
                              pochodnych od innych interfejsów”.               ]
                                                                                   UVTKPI 0COG ]IGV _
                                                                                   właściwość tylko do odczytu
                                                                                   XQKF 'CV
KPV #OQWPV metoda
                                                                                   XQKF 'CV
UVTKPI HQQF6[RG KPV #OQWPV
                                                                                   przecią anie
                                                                               _




                           256
Interfejsy

Rysunek 8.8. Implementacja interfejsu przypomina
dziedziczenie. W przypadku metody niejawnej        Niejawna implementacja
wystarczy zaimplementować składowe interfejsu
jako metody publiczne
                                                   składowych interfejsu
                                                   Interfejsy są implementowane przez klasy.
 RWDNKE KPVGTHCEG +*WOCP                           Zaimplementowanie interfejsu oznacza
 ]                                                 wprowadzenie kodu dla wszystkich
     UVTKPI 0COG ]IGV _
     XQKF 5NGGR
UJQTV JQWTU
                                                   zdefiniowanych w nim metod. Kompilator
 _                                                 wymusza wprowadzenie kodu dla wszystkich
                                                   metod bez wyjątku. Wynika to stąd,
 RWDNKE ENCUU 2GTUQP  +*WOCP                       e programista wykorzystujący interfejs
 ]                                                 spodziewa się, e klasa implementująca
     RWDNKE UVTKPI 0COG
                                                   interfejs będzie zawierać definicje wszystkich
     ]
         IGV
                                                   zawartych w nim metod. Istnieją dwa
         ]                                         mechanizmy implementowania interfejsów
             TGVWTP 2CWN                          w klasie: mechanizm niejawny i jawny.




                                                                                                     Niejawna implementacja składowych
         _                                         Najpierw zaprezentujemy mechanizm niejawny.
      _

     RWDNKE XQKF 5NGGR
UJQTV JQWTU
                                                   Aby zaimplementować interfejs
     ]                                             w sposób niejawny:
         HQT
UJQTV EQWPVGT
         EQWPVGTJQWTU EQWPVGT

                 1. Po nazwie klasy, która będzie implementować
         ]                                            interfejs, wpisz dwukropek, a po nim nazwę
           *VVR%QPVGZV EQPVGZV                       interfejsu, który będzie implementowany.
           *VVR%QPVGZV%WTTGPV
           EQPVGZV4GURQPUG9TKVG
 %JTCRKG       2. Wprowadź składowe odpowiadające
         _                                            wszystkim składowym interfejsu.
     _
 _                                                 3. Oznacz metody implementacyjne jako
                                                      publiczne.
                                                   4. Wpisz kod składowych interfejsu
                                                      (rysunek 8.8).




                                                                                             257
Rozdział 8.

                                    Wskazówki                                        Rysunek 8.9. Klasa Person implementuje
                                                                                     zarówno interfejs IHuman, jak i IManager.
                                       Ten mechanizm implementacji interfejsu        Zaimplementowanie interfejsu ustanawia relację
                                       cechuje wada polegająca na tym, e ka dą       „jest”. Innymi słowy, osoba (Person) jest
                                       metodę implementacyjną nale y oznaczyć        człowiekiem (Human) i mened erem (Manager)
                                       jako publiczną.
                                       Aby zaimplementować więcej ni jeden            RWDNKE KPVGTHCEG +*WOCP
                                                                                      ]
                                       interfejs, nale y oddzielić poszczególne
                                                                                          UVTKPI 0COG ]IGV _
                                       nazwy interfejsu przecinkiem (rysunek 8.9).        XQKF 5NGGR
UJQTV JQWTU
                                                                                      _

                                                                                      RWDNKE KPVGTHCEG +/CPCIGT
                                                                                      ]
                                                                                          XQKF 5R[1P'ORNQ[GG
UVTKPI PCOG DQQN
                                                                                          +U7PCYCTG
                                                                                      _
Niejawna implementacja składowych




                                                                                      RWDNKE ENCUU 2GTUQP  +*WOCP +/CPCIGT
                                                                                      ]
                                                                                          RWDNKE UVTKPI 0COG
                                                                                          ]
                                                                                              IGV
                                                                                              ]
                                                                                                  TGVWTP 2CWN 
                                                                                              _
                                                                                           _

                                                                                          RWDNKE XQKF 5NGGR
UJQTV JQWTU
                                                                                          ]
                                                                                              HQT
UJQTV EQWPVGT
                                                                                              EQWPVGTJQWTU EQWPVGT


                                                                                              ]
                                                                                                *VVR%QPVGZV EQPVGZV 
                                                                                                *VVR%QPVGZV%WTTGPV
                                                                                                EQPVGZV4GURQPUG9TKVG
 %JTCRKG 
                                                                                              _
                                                                                          _

                                                                                          RWDNKE XQKF 5R[1P'ORNQ[GG
UVTKPI PCOG
                                                                                          DQQN +U7PCYCTG
                                                                                          ]
                                                                                              YJKNG 
+U7PCYCTG
                                                                                              ]
                                                                                                  .QQM1XGT5JQWNFGT
PCOG
                                                                                              _
                                                                                          _
                                                                                      _




                                    258
Interfejsy

Rysunek 8.10. W powy szym kodzie zdefiniowano        Je eli klasa jest pochodną innej klasy
klasę Person, która implementuje interfejs IHuman.   (nie interfejsu), najpierw nale y wymienić
Następnie, biorąc pod uwagę to, e nie wszystkie      klasę, która nie nale y do interfejsu,
osoby są mened erami, zdefiniowano klasę             a następnie implementowane interfejsy.
opisującą mened erów. Jednak, ze względu na to,
 e mened erowie są ludźmi (persons), klasa
                                                     Wszystkie te elementy trzeba oddzielić
ta dziedziczy wszystkie składowe klasy Person        przecinkami (rysunek 8.10).
(zasada dziedziczenia). Na końcu znajduje się
implementacja interfejsu IManager


 RWDNKE KPVGTHCEG +*WOCP
 ]
     UVTKPI 0COG ]IGV _
     XQKF 5NGGR
UJQTV JQWTU
 _

 RWDNKE KPVGTHCEG +/CPCIGT




                                                                                                     Niejawna implementacja składowych
 ]
     XQKF 5R[1P'ORNQ[GG
UVTKPI PCOG DQQN
     +U7PCYCTG
 _

 RWDNKE ENCUU 2GTUQP  +*WOCP
 ]
     RWDNKE UVTKPI 0COG
     ]
         IGV
         ]
             TGVWTP 2CWN 
         _
      _

     RWDNKE XQKF 5NGGR
UJQTV JQWTU
     ]
         HQT
UJQTV EQWPVGT
         EQWPVGTJQWTU EQWPVGT


         ]
           *VVR%QPVGZV EQPVGZV 
           *VVR%QPVGZV%WTTGPV
           EQPVGZV4GURQPUG9TKVG
 %JTCRKG 
         _
     _
 _
 RWDNKE ENCUU /CPCIGT  2GTUQP +/CPCIGT
     RWDNKE XQKF 5R[1P'ORNQ[GG
UVTKPI PCOG
     DQQN +U7PCYCTG
     ]
         YJKNG 
+U7PCYCTG
         ]
             .QQM1XGT5JQWNFGT
PCOG
         _
     _
 _




                                                                                             259
Rozdział 8.

                                                                                     Rysunek 8.11. W przypadku jawnego
                                 Jawna implementacja                                 implementowania interfejsu nie wprowadza się
                                 składowych interfejsu                               modyfikatorów dostępu. Nale y wpisać nazwę
                                                                                     interfejsu, po nim kropkę, a po niej nazwę metody
                                 Podczas implementowania interfejsu przez
                                 wprowadzanie składowych publicznych                  RWDNKE KPVGTHCEG +*WOCP
                                 powstaje problem polegający na tym, e czasami        ]
                                 dwa interfejsy zawierają metodę o takiej samej           UVTKPI 0COG ]IGV _
                                 nazwie i takich samych parametrach,                      XQKF 5NGGR
UJQTV JQWTU
                                 ale konieczne jest zaimplementowanie tych            _
                                 metod na dwa ró ne sposoby. W przypadku
                                                                                      RWDNKE ENCUU 2GTUQP  +*WOCP
                                 zastosowania metody niejawnej jedna metoda           ]
                                 publiczna będzie stanowiła implementację                 UVTKPI +*WOCP0COG
                                 metod o takiej samej nazwie i tym samym                  ]
                                 zbiorze parametrów dla wszystkich interfejsów.               IGV
                                 Metoda jawna umo liwia poinformowanie                        ]
                                                                                                  TGVWTP 2CWN 
                                 kompilatora o tym, którą metodę, którego                     _
Jawna implementacja składowych




                                 interfejsu mieliśmy zamiar zaimplementować.               _

                                 Aby jawnie zaimplementować                               XQKF +*WOCP5NGGR
UJQTV JQWTU
                                                                                          ]
                                 interfejs:                                                   HQT
UJQTV EQWPVGT
                                 1. Po nazwie klasy, która będzie implementować               EQWPVGTJQWTU EQWPVGT


                                                                                              ]
                                    interfejs, wpisz dwukropek, a po nim nazwę                  *VVR%QPVGZV EQPVGZV 
                                    interfejsu, który będzie implementowany.                    *VVR%QPVGZV%WTTGPV
                                                                                                EQPVGZV4GURQPUG9TKVG
 %JTCRKG 
                                 2. Wpisz typ zwracanej wartości dla składowej
                                                                                              _
                                    interfejsu.                                           _
                                                                                      _
                                 3. Wpisz +0CYC+PVGTHGLUW/GVQFC+PVGTHGLUW.
                                    Mówiąc inaczej, wpisz nazwę interfejsu,
                                    po nim kropkę, a po niej nazwę metody
                                    interfejsu.
                                 4. Wprowadź parametry składowej interfejsu.
                                 5. Wpisz kod składowej interfejsu (rysunek 8.11).

                                 Wskazówka
                                    Wszystkie metody implementowane w ten
                                    sposób są prywatne. Nie mo na wprowadzić
                                    modyfikatora dostępu na początku definicji.




                                 260
Interfejsy


Usprawnianie
przykładowej aplikacji
Teraz, kiedy wiemy ju , w jaki sposób definiuje
się interfejsy oraz jak nale y implementować
interfejsy za pomocą klas, czas usprawnić
przykładową aplikację. Dokładniej rzecz ujmując,
zdefiniujemy klasę, która będzie słu yć jako
moduł u ytkownika. Aby przekształcić klasę
w moduł, nale y zaimplementować w niej
interfejs 5[UVGO9GD+*VVR/QFWNG. Jego
zaimplementowanie nie jest trudne — zawiera
tylko dwie metody: +PKV i KURQUG. Środowisko
ASP .NET wywołuje metodę +PKV w momencie,
gdy moduł jest po raz pierwszy ładowany




                                                    Usprawnianie przykładowej aplikacji
do pamięci. Metoda KURQUG wywoływana jest
w momencie usuwania modułu z pamięci.
Jedyna trudność polega na wykorzystaniu
zdarzenia. Zdarzenia zostaną opisane
w rozdziale 10. „Delegaty i zdarzenia”.
Nie zamierzamy poświęcać w tym rozdziale
wiele miejsca na tłumaczenie, czym jest
zdarzenie. Na razie wystarczy, abyśmy wiedzieli,
 e zdarzenie jest metodą wywoływaną w wyniku
działania. Implementacja zdarzeń pod wieloma
względami przypomina implementację
interfejsów. Ró nica polega na tym, e interfejs
mo e zawierać kilka metod, natomiast zdarzenie
zawiera tylko jedną metodę. Przykładem
zdarzenia jest kliknięcie przycisku. Klasa ąda
od zdarzenia ENKEM informacji od przycisku
formularza. Kiedy u ytkownik kliknie przycisk,
serwer informuje klasę, e miało miejsce
zdarzenie. Moduł mo na wykorzystać
np. do nasłuchiwania wystąpienia zdarzenia
$GIKP4GSWGUV. Środowisko ASP .NET wyzwala
to zdarzenie za ka dym razem, gdy przeglądarka
klienta za ąda strony.




                                            261
Rozdział 8.

                                      Aby zdefiniować
                                      klasę modułu użytkownika:
                                      1. Z paska menu wybierz polecenie Project/
                                         Add class. Wpisz custommodule.cs jako
                                         nazwę klasy i wciśnij Enter (rysunek 8.12).
                                      2. W górnej części kodu modułu, poni ej
                                         wiersza o treści WUKPI 5[UVGO, wpisz wiersz
                                         WUKPI 5[UVGO9GD.
                                      3. W wierszu w postaci: RWDNKE ENCUU
                                         EWUVQOOQFWNG dodaj na końcu: +*VVR/QFWNG
                                         tak, aby wiersz ten przyjął postać: RWDNKE    Rysunek 8.12. Wszystkie właściwości funkcjonalne
                                         ENCUU EWUVQOOQFWNG +*VVR/QFWNG.              modułu u ytkownika zostaną zaimplementowane
                                                                                       w klasie custommodule. Dzięki wykorzystaniu okna
                                      4. Teraz trzeba trochę „pooszukiwać”.            dialogowego pokazanego na rysunku u yjemy
Usprawnianie przykładowej aplikacji




                                         W systemie Visual Studio .NET znajduje się    kreatora do wygenerowania szkieletu klasy
                                         kreator pozwalający na łatwą implementację
                                         interfejsu. Z menu wybierz polecenie
                                         View/Class View.
                                      5. W oknie Class View rozwiń folder
                                         interfacesproject/custommodule/Bases and
                                         interfaces. Kliknij prawym klawiszem myszy
                                         IHttpModule i z rozwijanego menu wybierz
                                         Add/Implement Interface (rysunek 8.13).




                                                                                       Rysunek 8.13. Kreator implementacji interfejsu
                                                                                       wykorzystuje mechanizm niejawnej implementacji.
                                                                                       Dla ka dej składowej interfejsu definiowane są
                                                                                       elementy publiczne




                                      262
Interfejsy

Rysunek 8.14. Interfejs IHttpModule spełnia            6. Kreator spowoduje dodanie namiastek
dwie funkcje. Po pierwsze, informuje środowisko           metod +PKV i KURQUG. Kod przyjmie postać
ASP .NET, e klasa jest modułem u ytkownika.                 widoczną na rysunku 8.14.
Po drugie, środowisko zyskuje mo liwość
poinformowania klasy, kiedy moduł jest ładowany        7. Dodaj do klasy metodę $GIKP4GSWGUV
po raz pierwszy (metoda Init) oraz kiedy nie jest ju        (rysunek 8.15).
potrzebny (metoda Dispose)


 WUKPI 5[UVGO
 WUKPI 5[UVGO9GD

 PCOGURCEG KPVGTHCEGURTQLGEV
 ]
     UWOOCT[                                       Rysunek 8.15. Metoda BeginRequest nie jest częścią
                                                       interfejsu IHttpModule. Jest to zdarzenie zdefiniowane
      Ogólny opis modułu custommodule               dla klasy HttpApplication, informujące o tym,
      UWOOCT[                                      e występują ądania do dowolnej ze stron w aplikacji
     RWDNKE ENCUU EWUVQOOQFWNG  +*VVR/QFWNG




                                                                                                                Usprawnianie przykładowej aplikacji
     ]
        RWDNKE EWUVQOOQFWNG
                           WUKPI 5[UVGO
        ]                                               WUKPI 5[UVGO9GD
           
            DO ZROBIENIA: Tutaj nale y                PCOGURCEG KPVGTHCEGURTQLGEV
           wprowadzić logikę konstruktora             ]
                                                       UWOOCT[
        _
                                                             Ogólny opis modułu custommodule
           TGIKQP +ORNGOGPVCVKQP QH +*VVR/QFWNG              UWOOCT[
          RWDNKE XQKF                                       RWDNKE ENCUU EWUVQOOQFWNG  +*VVR/QFWNG
          +PKV
5[UVGO9GD*VVR#RRNKECVKQP EQPVGZV          ]
          ]                                                    RWDNKE EWUVQOOQFWNG

          _                                                    ]
                                                                  
          RWDNKE XQKF KURQUG
                                    DO ZROBIENIA: Tutaj nale y wprowadzić
          ]                                                       logikę konstruktora
          _                                                       
           GPFTGIKQP                                           _
      _
 _                                                               TGIKQP +ORNGOGPVCVKQP QH +*VVR/QFWNG
                                                                RWDNKE XQKF
                                                                +PKV
5[UVGO9GD*VVR#RRNKECVKQP EQPVGZV
                                                                ]
                                                                _

                                                                RWDNKE XQKF KURQUG

                                                                ]
                                                                _
                                                                 GPFTGIKQP

                                                                XQKF $GIKP4GSWGUV
QDLGEV UGPFGT
                                                                'XGPV#TIU CTIU
                                                                ]
                                                                _
                                                            _
                                                        _


                                                                                                        263
Rozdział 8.

                                      8. W metodzie +PKV wprowadź kod wią ący          Rysunek 8.16. Zwróć uwagę, e w celu powiązania
                                         zdarzenie $GIKP4GSWGUV z metodą klasy         zdarzenia klasy z metodą do zdarzenia odwołujemy
                                         $GIKP4GSWGUV (rysunek 8.16). Nie martw się,   się w taki sposób, jakby było ono właściwością
                                         je eli na razie kod ten jest niejasny, jego   obiektu (obiekt.nazwazdarzenia), następnie
                                                                                       u ywamy operatora += i przypisujemy mu nowy
                                         szczegółowe wyjaśnienie znajdzie się          obiekt (delegat). Metodę przekazujemy jako
                                         w rozdziale 10. „Delegaty i zdarzenia”.       parametr konstruktora obiektu


                                                                                        WUKPI 5[UVGO
                                                                                        WUKPI 5[UVGO9GD

                                                                                        PCOGURCEG KPVGTHCEGURTQLGEV
                                                                                        ]
                                                                                            UWOOCT[

                                                                                             1IÎNP[ QRKU OQFW W EWUVQOOQFWNG
                                                                                             UWOOCT[
                                                                                            RWDNKE ENCUU EWUVQOOQFWNG  +*VVR/QFWNG
Usprawnianie przykładowej aplikacji




                                                                                            ]
                                                                                               RWDNKE EWUVQOOQFWNG

                                                                                               ]
                                                                                                  
                                                                                                  DO ZROBIENIA: Tutaj nale y
                                                                                                  wprowadzić logikę konstruktora
                                                                                                  
                                                                                               _

                                                                                                 TGIKQP +ORNGOGPVCVKQP QH +*VVR/QFWNG
                                                                                                RWDNKE XQKF
                                                                                                +PKV
5[UVGO9GD*VVR#RRNKECVKQP EQPVGZV
                                                                                                ]
                                                                                                    EQPVGZV$GIKP4GSWGUV 
 PGY
                                                                                                    'XGPV*CPFNGT
$GIKP4GSWGUV
                                                                                                _

                                                                                                RWDNKE XQKF KURQUG

                                                                                                ]
                                                                                                _
                                                                                                  GPFTGIKQP

                                                                                                XQKF $GIKP4GSWGUV
QDLGEV UGPFGT
                                                                                                'XGPV#TIU CTIU
                                                                                                ]
                                                                                                _
                                                                                            _
                                                                                        _




                                      264
Interfejsy

Rysunek 8.17. Doceń piękno literałów znakowych.     9. Wprowadź kod w metodzie +PKV w celu
Zwróć uwagę, jak łatwo — korzystając z literałów      utworzenia ciągu znaków stanowiącego
znakowych — mo na umieścić znaki końca wiersza        skrypt działający po stronie klienta i zapisz
w ciągu znaków. Po prostu formatujemy ciąg            go w obiekcie #RRNKECVKQP. Pamiętaj,
znaków, tak jak chcemy, umieszczając gdzie nale y
znaki końca wiersza
                                                       e obiekt #RRNKECVKQP jest dostępny
                                                      na wszystkich stronach i dla ka dego
                                                      klienta (rysunek 8.17).
 RWDNKE XQKF +PKV
5[UVGO9GD*VVR#RRNKECVKQP
 EQPVGZV
 ]
     EQPVGZV$GIKP4GSWGUV 
 PGY
 'XGPV*CPFNGT
$GIKP4GSWGUV
     UVTKPI JVON  
     JVON
      CFQYCPKG
     UETKRV NCPIWCIGXDUETKRV
     5WD )GVKOGPUKQPU

         KO ENKGPV9KFVJ




                                                                                                        Usprawnianie przykładowej aplikacji
         KO ENKGPV*GKIJV

         ENKGPV9KFVJ  FQEWOGPVDQF[%NKGPV9KFVJ
         ENKGPV*GKIJV 
         FQEWOGPVDQF[%NKGPV*GKIJV
         FQEWOGPVO[HQTOVZVKOGPUKQPU8CNWG
         ENKGPV9KFVJ            ENKGPV*GKIJV
            
         FQEWOGPVO[HQTOUWDOKV
     'PF 5WD
     UETKRV
     DQF[ QP.QCF  )GVKOGPUKQPU
     HQTO PCOG O[HQTO OGVJQF 2156
     CEVKQP  ]_
     R KPRWV V[RG JKFFGP
     PCOG VZVKOGPUKQPU
     UKG  R
     HQTO
     DQF[
     JVON 

 EQPVGZV#RRNKECVKQP= AAKUEQXGT*6/. ?JVON
 _




                                                                                                265
Rozdział 8.

                                      10. Teraz, w treści metody $GIKP4GSWGUV wpisz            Rysunek 8.18. Na tym rysunku znalazł się kod,
                                         kod pokazany na rysunku 8.18. Zadaniem                który wymaga wyjaśnienia. Szczegółowe
                                         tego kodu jest sprawdzenie, czy są dostępne           informacje na jego temat mo na znaleźć w ramce
                                         informacje o wymiarach. Informacje                    pt. „Szczegóły zdarzenia BeginRequest”
                                         te powinny być dostępne za pośrednictwem
                                         pola ukrytego. Je eli pole tekstowe nie istnieje,      XQKF $GIKP4GSWGUV
QDLGEV UGPFGT 'XGPV#TIU
                                         moduł zablokuje ądanie strony i wyśle                  CTIU
                                         skrypt działający po stronie klienta. Skrypt           ]
                                         zarejestruje wymiary okna w ukrytym polu                   )NQDCN I  
)NQDCNUGPFGT
                                                                                                    UVTKPI FKOGPUKQPU 
                                         i natychmiast za ąda strony ponownie. Moduł
                                                                                                    I4GSWGUV(QTO= VZVKOGPUKQPU ?
                                         sprawdzi, czy pole tekstowe istnieje i, je eli             KH 
FKOGPUKQPU  PWNN ^^ FKOGPUKQPU 
                                         istnieje, wprowadzi wymiary do obiektu +VGO                  
                                         (więcej informacji na ten temat znajdzie się               ]
                                         w ramce na następnej stronie).                                 UVTKPI JVON  
UVTKPII%QPVGZV
                                                                                                        å#RRNKECVKQP= AAKUEQXGT*6/. ?
                                      Wskazówki                                                         UVTKPI PGY7TN  UVTKPI(QTOCV
JVON
                                                                                                        I4GSWGUV7TN#DUQNWVG2CVJ
Usprawnianie przykładowej aplikacji




                                         Kod zaprezentowany w tym podrozdziale                          I4GURQPUG9TKVG
PGY7TN
                                         to kompletny kod potrzebny do utworzenia                       I%QORNGVG4GSWGUV

                                         modułu u ytkownika. Jednak moduł ten nie                   _
                                                                                                    GNUG KH
                                         będzie działać dopóty, dopóki nie uzupełnimy
                                                                                                    
FKOGPUKQPU+PFGZ1H
 %NKGPV9KFVJ   
                                         przykładu kodem pokazanym w dalszej części                 ]
                                         tego rozdziału.                                               UVTKPI=? UKGU  FKOGPUKQPU5RNKV
  
                                                                                                       KPV ENKGPV9KFVJ  5[UVGO%QPXGTV
                                         Kreator implementujący interfejsy wprowadza                   6Q+PV
UKGU=?
                                         kod TGIKQP +ORNGOGPVCVKQP QH +*VVR/QFWNG                      KPV ENKGPV*GKIJV 
                                         na początku bloku metod implementacyjnych                     5[UVGO%QPXGTV6Q+PV
UKGU=?
                                         oraz GPFTGIKQP na końcu tego bloku.                            I%QPVGZV+VGOU= AA%NKGPV9KFVJ ? 
                                         Te instrukcje nie dotyczą bezpośrednio                         ENKGPV9KFVJ
                                         kompilatora. Umo liwiają one uzyskanie                         I%QPVGZV+VGOU= AA%NKGPV*GKIJV ? 
                                         rozwijanego kodu w edytorze. Jak mo na                         ENKGPV*GKIJV
                                                                                                    _
                                         zauwa yć, w edytorze pojawi się znak minus             _
                                         z lewej strony deklaracji regionu (rysunek 8.19).
                                         Kliknięcie znaku minus w edytorze spowoduje
                                         ukrycie kodu umieszczonego w obszarze
                                         i zastąpienie znaku minus plusem
                                         (rysunek 8.20). Kliknięcie znaku plus
                                         spowoduje ponowne pojawienie się kodu.
                                                                                               Rysunek 8.19. Instrukcja #region powoduje
                                                                                               dodanie obszaru rozwijanego kodu. Kiedy edytor
                                                                                               wykryje dyrektywę #region, umieszcza znak minus
                                                                                               po lewej stronie okna kodu



                                      Rysunek 8.20. Kliknięcie znaku minus powoduje
                                      rozwinięcie kodu obszaru i wyświetlenie opisu
                                      za słowem #region, umo liwiającego identyfikację
                                      kodu. Słowo kluczowe #region w kodzie nie ma adnego
                                      znaczenia funkcjonalnego. Jest ono wykorzystywane
                                      wyłącznie przez edytor, zatem, je eli komuś wydaje się
                                      niepotrzebne, mo e je usunąć

                                      266
Interfejsy



                       Szczegóły zdarzenia BeginRequest
W pierwszym wierszu metody $GIKP4GSWGUV znajduje się instrukcja konwersji obiektu UGPFGT
(pierwszy parametr metody) na obiekt )NQDCN. )NQDCN jest klasą generowaną przez kreator
podczas tworzenia projektu ASP .NET. Jest to pochodna klasy *VVR#RRNKECVKQP. Obiekt tej klasy
tworzy się za pierwszym razem, gdy dowolny klient skorzysta z dowolnej strony w aplikacji.
Z obiektu )NQDCN mo na uzyskać dostęp do innych obiektów — np. 4GURQPUG lub 4GSWGUV.
W drugim wierszu kodu u yto obiektu )NQDCN do uzyskania obiektu 4GSWGUV. Jak pamiętamy,
obiekt 4GSWGUV umo liwia uzyskanie informacji na temat ądania klienta. Je eli skorzystamy
z właściwości (QTO, mo emy uzyskać dostęp do ukrytego pola, które zostało utworzone
przez skrypt działający po stronie klienta. Nazwa tego ukrytego pola to VZVKOGPUKQPU.
W wierszu I4GSWGUV(QTO= VZVKOGPUKQPU ? następuje pobranie tekstu z ukrytego pola.
Je eli pole nie istnieje, zwrócony wynik będzie wartością PWNN. W przeciwnym razie będą
to współrzędne obszaru klienta. Skrypt działający po stronie klienta zapisuje współrzędne
w postaci: szerokość;wysokość (np. 800;600). Je eli wynik wynosi PWNN, do klienta wysyłany
jest skrypt za pomocą funkcji 4GURQPUG9TKVG. Potem następuje wywołanie funkcji




                                                                                                    Usprawnianie przykładowej aplikacji
%QORNGVG4GSWGUV, której działanie polega na zatrzymaniu ądania strony. Je eli wymiary są
dostępne, następuje rozbicie ciągu znaków o formacie szerokość;wysokość na dwie liczby
i konwersja tych liczb na typ KPVGIGT. Wartości te są następnie umieszczone w obiekcie +VGOU.
Do tej pory nie u ywaliśmy obiektu +VGOU, ale przypomina on obiekty 5GUUKQP oraz #RRNKECVKQP.
Ogólnie rzecz biorąc, jest to jeszcze jeden sposób utrwalania informacji. Ró nica między
tymi obiektami polega na czasie dostępności informacji. W obiekcie +VGOU informacje są
dostępne tylko na czas trwania ądania klienta. W przypadku obiektu #RRNKECVKQP informacje
są dostępne tak długo, jak serwer WWW przetwarza aplikację i mają do nich dostęp wszystkie
klienty korzystające z aplikacji. Informacje zapisane w obiekcie 5GUUKQP są dostępne na czas
trwania programu, ale są one specyficzne dla ka dego klienta. Obiekt +VGOU istnieje tylko
na czas ądania. Je eli zatem klient przechodzi z jednej strony na drugą, informacje zostają
utracone. W ramach tego samego ądania moduł mo e jednak umieścić informacje
w obiekcie +VGOU i strona będzie miała do nich dostęp przez odwołanie I%QPVGZV+VGOU.




                                                                                            267
Rozdział 8.

                                                                              Rysunek 8.21. Chocia typem zmiennej jest ICar,
                         Wykorzystanie obiektów                               nie mo na napisać new ICar. Trzeba utworzyć
                         poprzez interfejsy                                   egzemplarz klasy implementującej interfejs.
                                                                              Nie mo na tworzyć egzemplarzy interfejsu
                         Kiedy programista zdefiniuje interfejs
                         i zaimplementuje go jako konkretną klasę,             KPVGTHCEG   +%CT
                         mo e u ywać tej klasy poprzez interfejs.              ]
                                                                                  UVTKPI   4WP

                         Aby używać klasy poprzez interfejs:                      UVTKPI   5VQR

                                                                                  UVTKPI   2NC[/WUKE

                         1. Zdefiniuj zmienną typu interfejsu.                 _
                            Wpisz na przykład +%CT XCT.
                                                                               ENCUU 'UEQTV  +%CT
                         2. Ustaw zmienną typu interfejsu na wartość           ]
                            równą klasie, która ten interfejs implementuje.       RWDNKE UVTKPI 4WP

                            Wpisz na przykład  PGY 'UEQTV
                      ]
                                                                                     TGVWTP ,CFú VCM U[DMQ LCM WOKGO 
                            (rysunek 8.21).                                       _
                                                                                  RWDNKE UVTKPI 5VQR

                         Wskazówka                                                ]
                                                                                     TGVWTP ,CM FQDTG 9TGUEKG UKú OQIú
                            Nie mo na tworzyć egzemplarzy interfejsu.
Wykorzystanie obiektów




                                                                                     CVT[OCè 
                            Interfejs jest typem abstrakcyjnym,                   _
                            co oznacza, e nie jest to klasa, której               RWDNKE UVTKPI 2NC[/WUKE

                            obiekty mo na utworzyć. Zamiast tego                  ]
                            tworzy się egzemplarze klasy                             TGVWTP ,GUVG O[ RKTCVCOK MVÎT[ PKE
                            implementującej interfejs.                               PKG TQDKæ 
                                                                                  _
                                                                               _

                                                                               ENCUU TKXGT
                                                                               ]
                                                                                  RWDNKE UVTKPI )Q6Q9QTM

                                                                                  ]
                                                                                     +%CT ECT  PGY 'UEQTV

                                                                                     UVTKPI OUI  
                                                                                     OUI
 ECT4WP

                                                                                     OUI
 ECT2NC[/WUKE

                                                                                     OUI
 ECT5VQR

                                                                                     TGVWTP OUI
                                                                                  _
                                                                               _




                         268
Interfejsy

Rysunek 8.22. Zmienna obj jest typu object.
Oznacza to, e mo e wskazywać na obiekt Cat          Rozpoznawanie interfejsu
lub na obiekt Dog. Powy szy kod testuje zawartość   Przed u yciem obiektu poprzez interfejs warto
zmiennej obj przez sprawdzenie, czy obiekt obj
obsługuje interfejs IDog
                                                    sprawdzić, czy obiekt rzeczywiście obsługuje
                                                    interfejs. Oczywiście, je eli mamy dostęp
                                                    do definicji klasy, mo emy na nią spojrzeć
 KPVGTHCEG +%CV                                     i przekonać się, czy klasa implementuje interfejs.
 ]                                                  Czasami jednak mamy do czynienia z danymi
    UVTKPI +IPQTG1YPGT

 _
                                                    typu QDLGEV, dla których trzeba zweryfikować,
                                                    czy obiekt, na który wskazuje zmienna, jest
 KPVGTHCEG +QI                                     zgodny z interfejsem, którego chcemy u yć.
 ]                                                  Istnieją dwa sposoby sprawdzenia, czy obiekt
    UVTKPI .KUVGP6Q1YPGT
                         obsługuje interfejs.
 _

 ENCUU 2QQFNG  +QI                                Aby sprawdzić,
 ]                                                  czy obiekt obsługuje interfejs:
 _
                                                    1. Wpisz KH 
QDL KU +#P[VJKPI, gdzie QDL
 ENCUU 5KCOGUG  +%CV                                  jest zmienną wskazującą na obiekt, który




                                                                                                          Rozpoznawanie interfejsu
 ]                                                     chcesz sprawdzić, natomiast +#P[VJKPI
 _
                                                       jest nazwą interfejsu, dla którego chcesz
 ENCUU 1YPGT                                           przeprowadzić test (rysunek 8.22).
 ]
                                                       lub
    XQKF (GGF#PKOCN
QDLGEV QDL
    ]                                                  Wpisz +#P[VJKPI XCT  QDL CU +#P[VJKPI,
       KH 
QDL KU +QI
                                                       gdzie +#P[VJKPI jest interfejsem, dla którego
       ]
          +QI FQI  
+QIQDL                        chcesz przeprowadzić test, XCT jest dowolną
          UVTKPI EOF  FQI.KUVGP6Q1YPGT
            zmienną słu ącą do przechowywania
       _                                               odwołania do obiektu, a QDL jest obiektem,
    _                                                  który chcesz sprawdzić.
 _




                                                                                                  269
Rozdział 8.

                           2. Wpisz instrukcję KH 
XCT PWNN. Je eli          Rysunek 8.23. Kiedy do sprawdzenia, czy obiekt
                              po wykonaniu pierwszego kroku zmienna            obsługuje interfejs, u yjemy polecenia as, uzyskamy
                              XCT jest równa null, obiekt nie obsługuje        wynik null wtedy, gdy obiekt go nie obsługuje
                              interfejsu. Jeśli test zwróci wartość ró ną
                              od null, obiekt obsługuje interfejs, a zmienna    KPVGTHCEG +%CV
                              XCT wskazuje na odwołanie do interfejsu           ]
                              (rysunek 8.23).                                      UVTKPI +IPQTG1YPGT

                                                                                _
                           Wskazówki
                                                                                KPVGTHCEG +QI
                              Podczas korzystania z pierwszego                  ]
                                                                                   UVTKPI .KUVGP6Q1YPGT

                              mechanizmu, po uzyskaniu informacji,
                                                                                _
                               e obiekt obsługuje interfejs, aby u yć
                              obiektu poprzez interfejs, nale y zadeklarować    ENCUU 2QQFNG  +QI
                              zmienną typu interfejsu, po czym dokonać          ]
                              konwersji obiektu na interfejs.                   _

                              W przypadku drugiego mechanizmu                   ENCUU 5KCOGUG  +%CV
                              rozpoznawania interfejsu, zarówno konwersja       ]
                              obiektu, jak i rozpoznanie następuje              _
Rozpoznawanie interfejsu




                              w jednym kroku. Je eli obiekt obsługuje
                                                                                ENCUU 1YPGT
                              interfejs, zmienna XCT będzie wskazywać           ]
                              na obiekt, w przeciwnym razie zmienna XCT            XQKF (GGF#PKOCN
QDLGEV QDL
                              przyjmie wartość null.                               ]
                                                                                       +QI FQI  QDL CU +QI
                              Istnieje trzeci mechanizm rozpoznawania,                 KH 
FQI  PWNN
                              czy obiekt obsługuje interfejs. Mo na                      UVTKPI EOF  FQI.KUVGP6Q1YPGT

                              spróbować dokonać konwersji obiektu                  _
                              na interfejs. Je eli obiekt nie obsługuje         _
                              interfejsu, konwersja spowoduje zgłoszenie
                              wyjątku (błędu). Wyjątki zostaną omówione
                              w rozdziale 11. „Obsługa błędów”.
                              Wykorzystywanie wyjątków nie jest
                              zalecane jako sposób rozpoznawania
                              obsługi interfejsu przez obiekty, poniewa
                              wyjątki mogą wpłynąć niekorzystnie
                              na wydajność działania programu.




                           270
C# i ASP.NET. Szybki start
C# i ASP.NET. Szybki start
C# i ASP.NET. Szybki start
C# i ASP.NET. Szybki start
C# i ASP.NET. Szybki start
C# i ASP.NET. Szybki start
C# i ASP.NET. Szybki start
C# i ASP.NET. Szybki start

More Related Content

What's hot

RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...Wydawnictwo Helion
 
Po prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowanePo prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowaneWydawnictwo Helion
 
Visual C# 2005. Zapiski programisty
Visual C# 2005. Zapiski programistyVisual C# 2005. Zapiski programisty
Visual C# 2005. Zapiski programistyWydawnictwo Helion
 
Aplikacje w Visual C++ 2005. Przykłady
Aplikacje w Visual C++ 2005. PrzykładyAplikacje w Visual C++ 2005. Przykłady
Aplikacje w Visual C++ 2005. PrzykładyWydawnictwo Helion
 
C++. Styl i technika zaawansowanego programowania
C++. Styl i technika zaawansowanego programowaniaC++. Styl i technika zaawansowanego programowania
C++. Styl i technika zaawansowanego programowaniaWydawnictwo Helion
 
C++Builder i Turbo C++. Podstawy
C++Builder i Turbo C++. PodstawyC++Builder i Turbo C++. Podstawy
C++Builder i Turbo C++. PodstawyWydawnictwo Helion
 
PHP4. Zaawansowane programowanie
PHP4. Zaawansowane programowaniePHP4. Zaawansowane programowanie
PHP4. Zaawansowane programowanieWydawnictwo Helion
 
PHP5. Profesjonalne tworzenie oprogramowania
PHP5. Profesjonalne tworzenie oprogramowaniaPHP5. Profesjonalne tworzenie oprogramowania
PHP5. Profesjonalne tworzenie oprogramowaniaWydawnictwo Helion
 
ASP.NET 3.5 dla programistów PHP
ASP.NET 3.5 dla programistów PHPASP.NET 3.5 dla programistów PHP
ASP.NET 3.5 dla programistów PHPWydawnictwo Helion
 
mod_perl. Podręcznik programisty
mod_perl. Podręcznik programistymod_perl. Podręcznik programisty
mod_perl. Podręcznik programistyWydawnictwo Helion
 
Delphi 7. Ćwiczenia zaawansowane
Delphi 7. Ćwiczenia zaawansowaneDelphi 7. Ćwiczenia zaawansowane
Delphi 7. Ćwiczenia zaawansowaneWydawnictwo Helion
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówWydawnictwo Helion
 
.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanie.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanieWydawnictwo Helion
 
Aplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie IIAplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie IIWydawnictwo Helion
 
C++. Inżynieria programowania
C++. Inżynieria programowaniaC++. Inżynieria programowania
C++. Inżynieria programowaniaWydawnictwo Helion
 
Asembler. Podręcznik programisty
Asembler. Podręcznik programistyAsembler. Podręcznik programisty
Asembler. Podręcznik programistyWydawnictwo Helion
 
C++. Potęga języka. Od przykładu do przykładu
C++. Potęga języka. Od przykładu do przykładuC++. Potęga języka. Od przykładu do przykładu
C++. Potęga języka. Od przykładu do przykładuWydawnictwo Helion
 

What's hot (20)

RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
 
Po prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowanePo prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowane
 
Visual C# 2005. Zapiski programisty
Visual C# 2005. Zapiski programistyVisual C# 2005. Zapiski programisty
Visual C# 2005. Zapiski programisty
 
Aplikacje w Visual C++ 2005. Przykłady
Aplikacje w Visual C++ 2005. PrzykładyAplikacje w Visual C++ 2005. Przykłady
Aplikacje w Visual C++ 2005. Przykłady
 
C++. Styl i technika zaawansowanego programowania
C++. Styl i technika zaawansowanego programowaniaC++. Styl i technika zaawansowanego programowania
C++. Styl i technika zaawansowanego programowania
 
C++Builder i Turbo C++. Podstawy
C++Builder i Turbo C++. PodstawyC++Builder i Turbo C++. Podstawy
C++Builder i Turbo C++. Podstawy
 
PHP4. Zaawansowane programowanie
PHP4. Zaawansowane programowaniePHP4. Zaawansowane programowanie
PHP4. Zaawansowane programowanie
 
Visual C# .NET. Encyklopedia
Visual C# .NET. EncyklopediaVisual C# .NET. Encyklopedia
Visual C# .NET. Encyklopedia
 
ABC Delphi 2006
ABC Delphi 2006ABC Delphi 2006
ABC Delphi 2006
 
PHP5. Profesjonalne tworzenie oprogramowania
PHP5. Profesjonalne tworzenie oprogramowaniaPHP5. Profesjonalne tworzenie oprogramowania
PHP5. Profesjonalne tworzenie oprogramowania
 
ASP.NET 3.5 dla programistów PHP
ASP.NET 3.5 dla programistów PHPASP.NET 3.5 dla programistów PHP
ASP.NET 3.5 dla programistów PHP
 
mod_perl. Podręcznik programisty
mod_perl. Podręcznik programistymod_perl. Podręcznik programisty
mod_perl. Podręcznik programisty
 
Delphi 7. Ćwiczenia zaawansowane
Delphi 7. Ćwiczenia zaawansowaneDelphi 7. Ćwiczenia zaawansowane
Delphi 7. Ćwiczenia zaawansowane
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistów
 
.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanie.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanie
 
Aplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie IIAplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie II
 
ABC Delphi 7
ABC Delphi 7ABC Delphi 7
ABC Delphi 7
 
C++. Inżynieria programowania
C++. Inżynieria programowaniaC++. Inżynieria programowania
C++. Inżynieria programowania
 
Asembler. Podręcznik programisty
Asembler. Podręcznik programistyAsembler. Podręcznik programisty
Asembler. Podręcznik programisty
 
C++. Potęga języka. Od przykładu do przykładu
C++. Potęga języka. Od przykładu do przykładuC++. Potęga języka. Od przykładu do przykładu
C++. Potęga języka. Od przykładu do przykładu
 

Viewers also liked

PHP. Programowanie. Wydanie III
PHP. Programowanie. Wydanie IIIPHP. Programowanie. Wydanie III
PHP. Programowanie. Wydanie IIIWydawnictwo Helion
 
Narrative learning to ride
Narrative learning to rideNarrative learning to ride
Narrative learning to rideMr. Skipper
 
多愁善感而初次回憶的青春:縱論羅大佑(上)
多愁善感而初次回憶的青春:縱論羅大佑(上)多愁善感而初次回憶的青春:縱論羅大佑(上)
多愁善感而初次回憶的青春:縱論羅大佑(上)guestd47bd85
 
C++. Kruczki i fortele w programowaniu
C++. Kruczki i fortele w programowaniuC++. Kruczki i fortele w programowaniu
C++. Kruczki i fortele w programowaniuWydawnictwo Helion
 
Narrative learning to ride 2
Narrative learning to ride 2Narrative learning to ride 2
Narrative learning to ride 2Mr. Skipper
 
Adobe Photoshop 7. Wystarczy jedno kliknięcie!
Adobe Photoshop 7. Wystarczy jedno kliknięcie!Adobe Photoshop 7. Wystarczy jedno kliknięcie!
Adobe Photoshop 7. Wystarczy jedno kliknięcie!Wydawnictwo Helion
 
Office 365-single-sign-on-with-adfs
Office 365-single-sign-on-with-adfsOffice 365-single-sign-on-with-adfs
Office 365-single-sign-on-with-adfsamitchachra
 
Les professionnels de l'immobilier et les réseaux sociaux - Etude #DigImmo
Les professionnels de l'immobilier et les réseaux sociaux - Etude #DigImmoLes professionnels de l'immobilier et les réseaux sociaux - Etude #DigImmo
Les professionnels de l'immobilier et les réseaux sociaux - Etude #DigImmoImmobilier 2.0
 
Introduction to Agile & Agile MindSet
Introduction to Agile & Agile MindSetIntroduction to Agile & Agile MindSet
Introduction to Agile & Agile MindSetNamrata Datta
 

Viewers also liked (13)

Sztuka wojny
Sztuka wojnySztuka wojny
Sztuka wojny
 
PHP. Programowanie. Wydanie III
PHP. Programowanie. Wydanie IIIPHP. Programowanie. Wydanie III
PHP. Programowanie. Wydanie III
 
Narrative learning to ride
Narrative learning to rideNarrative learning to ride
Narrative learning to ride
 
Thinking in Photoshop
Thinking in PhotoshopThinking in Photoshop
Thinking in Photoshop
 
多愁善感而初次回憶的青春:縱論羅大佑(上)
多愁善感而初次回憶的青春:縱論羅大佑(上)多愁善感而初次回憶的青春:縱論羅大佑(上)
多愁善感而初次回憶的青春:縱論羅大佑(上)
 
Eitc Slideshow
Eitc SlideshowEitc Slideshow
Eitc Slideshow
 
C++. Kruczki i fortele w programowaniu
C++. Kruczki i fortele w programowaniuC++. Kruczki i fortele w programowaniu
C++. Kruczki i fortele w programowaniu
 
ActionScript. Receptury
ActionScript. RecepturyActionScript. Receptury
ActionScript. Receptury
 
Narrative learning to ride 2
Narrative learning to ride 2Narrative learning to ride 2
Narrative learning to ride 2
 
Adobe Photoshop 7. Wystarczy jedno kliknięcie!
Adobe Photoshop 7. Wystarczy jedno kliknięcie!Adobe Photoshop 7. Wystarczy jedno kliknięcie!
Adobe Photoshop 7. Wystarczy jedno kliknięcie!
 
Office 365-single-sign-on-with-adfs
Office 365-single-sign-on-with-adfsOffice 365-single-sign-on-with-adfs
Office 365-single-sign-on-with-adfs
 
Les professionnels de l'immobilier et les réseaux sociaux - Etude #DigImmo
Les professionnels de l'immobilier et les réseaux sociaux - Etude #DigImmoLes professionnels de l'immobilier et les réseaux sociaux - Etude #DigImmo
Les professionnels de l'immobilier et les réseaux sociaux - Etude #DigImmo
 
Introduction to Agile & Agile MindSet
Introduction to Agile & Agile MindSetIntroduction to Agile & Agile MindSet
Introduction to Agile & Agile MindSet
 

Similar to C# i ASP.NET. Szybki start

Visual C# 2008. Projektowanie aplikacji. Pierwsze starcie
Visual C# 2008. Projektowanie aplikacji. Pierwsze starcieVisual C# 2008. Projektowanie aplikacji. Pierwsze starcie
Visual C# 2008. Projektowanie aplikacji. Pierwsze starcieWydawnictwo Helion
 
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla WindowsVisual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla WindowsWydawnictwo Helion
 
C++. Wykorzystaj potęgę aplikacji graficznych
C++. Wykorzystaj potęgę aplikacji graficznychC++. Wykorzystaj potęgę aplikacji graficznych
C++. Wykorzystaj potęgę aplikacji graficznychWydawnictwo Helion
 
Programowanie w języku C. Szybki start
Programowanie w języku C. Szybki startProgramowanie w języku C. Szybki start
Programowanie w języku C. Szybki startWydawnictwo Helion
 
Visual Studio 2005. Programowanie z Windows API w języku C++
Visual Studio 2005. Programowanie z Windows API w języku C++Visual Studio 2005. Programowanie z Windows API w języku C++
Visual Studio 2005. Programowanie z Windows API w języku C++Wydawnictwo Helion
 
Programowanie obiektowe w Visual Basic .NET dla każdego
Programowanie obiektowe w Visual Basic .NET dla każdegoProgramowanie obiektowe w Visual Basic .NET dla każdego
Programowanie obiektowe w Visual Basic .NET dla każdegoWydawnictwo Helion
 
ASP.NET 2.0. Projektowanie aplikacji internetowych
ASP.NET 2.0. Projektowanie aplikacji internetowychASP.NET 2.0. Projektowanie aplikacji internetowych
ASP.NET 2.0. Projektowanie aplikacji internetowychWydawnictwo Helion
 
Praktyczny kurs Java. Wydanie II
Praktyczny kurs Java. Wydanie IIPraktyczny kurs Java. Wydanie II
Praktyczny kurs Java. Wydanie IIWydawnictwo Helion
 
Eclipse Web Tools Platform. Tworzenie aplikacji WWW w języku Java
Eclipse Web Tools Platform. Tworzenie aplikacji WWW w języku JavaEclipse Web Tools Platform. Tworzenie aplikacji WWW w języku Java
Eclipse Web Tools Platform. Tworzenie aplikacji WWW w języku JavaWydawnictwo Helion
 
Perl. Testowanie. Zapiski programisty
Perl. Testowanie. Zapiski programistyPerl. Testowanie. Zapiski programisty
Perl. Testowanie. Zapiski programistyWydawnictwo Helion
 
C++. 50 efektywnych sposobów na udoskonalenie Twoich programów
C++. 50 efektywnych sposobów na udoskonalenie Twoich programówC++. 50 efektywnych sposobów na udoskonalenie Twoich programów
C++. 50 efektywnych sposobów na udoskonalenie Twoich programówWydawnictwo Helion
 

Similar to C# i ASP.NET. Szybki start (18)

Visual C# 2008. Projektowanie aplikacji. Pierwsze starcie
Visual C# 2008. Projektowanie aplikacji. Pierwsze starcieVisual C# 2008. Projektowanie aplikacji. Pierwsze starcie
Visual C# 2008. Projektowanie aplikacji. Pierwsze starcie
 
C#. Programowanie
C#. ProgramowanieC#. Programowanie
C#. Programowanie
 
Spring. Zapiski programisty
Spring. Zapiski programistySpring. Zapiski programisty
Spring. Zapiski programisty
 
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla WindowsVisual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
 
C++. Wykorzystaj potęgę aplikacji graficznych
C++. Wykorzystaj potęgę aplikacji graficznychC++. Wykorzystaj potęgę aplikacji graficznych
C++. Wykorzystaj potęgę aplikacji graficznych
 
Programowanie w języku C. Szybki start
Programowanie w języku C. Szybki startProgramowanie w języku C. Szybki start
Programowanie w języku C. Szybki start
 
Visual Studio 2005. Programowanie z Windows API w języku C++
Visual Studio 2005. Programowanie z Windows API w języku C++Visual Studio 2005. Programowanie z Windows API w języku C++
Visual Studio 2005. Programowanie z Windows API w języku C++
 
Contribute 2. Szybki start
Contribute 2. Szybki startContribute 2. Szybki start
Contribute 2. Szybki start
 
Programowanie obiektowe w Visual Basic .NET dla każdego
Programowanie obiektowe w Visual Basic .NET dla każdegoProgramowanie obiektowe w Visual Basic .NET dla każdego
Programowanie obiektowe w Visual Basic .NET dla każdego
 
ASP.NET 2.0. Projektowanie aplikacji internetowych
ASP.NET 2.0. Projektowanie aplikacji internetowychASP.NET 2.0. Projektowanie aplikacji internetowych
ASP.NET 2.0. Projektowanie aplikacji internetowych
 
Praktyczny kurs Java. Wydanie II
Praktyczny kurs Java. Wydanie IIPraktyczny kurs Java. Wydanie II
Praktyczny kurs Java. Wydanie II
 
Praktyczny kurs Java
Praktyczny kurs JavaPraktyczny kurs Java
Praktyczny kurs Java
 
Eclipse Web Tools Platform. Tworzenie aplikacji WWW w języku Java
Eclipse Web Tools Platform. Tworzenie aplikacji WWW w języku JavaEclipse Web Tools Platform. Tworzenie aplikacji WWW w języku Java
Eclipse Web Tools Platform. Tworzenie aplikacji WWW w języku Java
 
C++BuilderX. Ćwiczenia
C++BuilderX. ĆwiczeniaC++BuilderX. Ćwiczenia
C++BuilderX. Ćwiczenia
 
Perl. Testowanie. Zapiski programisty
Perl. Testowanie. Zapiski programistyPerl. Testowanie. Zapiski programisty
Perl. Testowanie. Zapiski programisty
 
C++. 50 efektywnych sposobów na udoskonalenie Twoich programów
C++. 50 efektywnych sposobów na udoskonalenie Twoich programówC++. 50 efektywnych sposobów na udoskonalenie Twoich programów
C++. 50 efektywnych sposobów na udoskonalenie Twoich programów
 
Uczta programistów
Uczta programistówUczta programistów
Uczta programistów
 
JavaScript. Projekty
JavaScript. ProjektyJavaScript. Projekty
JavaScript. Projekty
 

More from Wydawnictwo Helion

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyWydawnictwo Helion
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikWydawnictwo Helion
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczneWydawnictwo Helion
 
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieE-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieWydawnictwo Helion
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsWydawnictwo Helion
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IIWydawnictwo Helion
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuWydawnictwo Helion
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIWydawnictwo Helion
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningWydawnictwo Helion
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykWydawnictwo Helion
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaWydawnictwo Helion
 

More from Wydawnictwo Helion (20)

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. Projekty
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnik
 
Access w biurze i nie tylko
Access w biurze i nie tylkoAccess w biurze i nie tylko
Access w biurze i nie tylko
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
 
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieE-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny trening
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
 

C# i ASP.NET. Szybki start

  • 1. IDZ DO PRZYK£ADOWY ROZDZIA£ SPIS TRE CI C# i ASP.NET. Szybki start Autor: Jose Mojica KATALOG KSI¥¯EK T³umaczenie: Wojciech Moch (rozdz. 1 - 6), Rados³aw Meryk (rozdz. 7 - 13) ISBN: 83-7361-389-7 KATALOG ONLINE Tytu³ orygina³u: C# Web Development with ASP.NET: Visual QuickStart Guide ZAMÓW DRUKOWANY KATALOG Format: B5, stron: 456 Przyk³ady na ftp: 1127 kB TWÓJ KOSZYK DODAJ DO KOSZYKA C# to ca³kiem nowy jêzyk programowania zaprojektowany przez firmê Microsoft. Wygl¹da on jak mieszanka C++ i Javy, jest jednak tak prosty jak Visual Basic. Z jego pomoc¹ mo¿na tworzyæ aplikacje WWW i programy wyposa¿one w graficzny CENNIK I INFORMACJE interfejs u¿ytkownika. Jêzyk ten zwi¹zany jest z platform¹ .NET, umo¿liwiaj¹c¹ tworzenie zaawansowanych aplikacji biznesowych dzia³aj¹cych w rodowisku ZAMÓW INFORMACJE sieciowym, w tym tak¿e z technologi¹ budowania dynamicznych serwisów O NOWO CIACH internetowych ASP.NET. Programy dzia³aj¹ce na platformie .NET mo¿na pisaæ w wielu jêzykach programowania, ale wiele wskazuje na to, ¿e w³a nie C# stanie siê ZAMÓW CENNIK najpopularniejszym z nich. Ksi¹¿ka „C# i ASP.NET. Szybki start” jest doskona³ym podrêcznikiem dla pocz¹tkuj¹cych programistów. Jak ka¿da pozycja z serii „Szybki start”, sk³ada siê CZYTELNIA z kilkudziesiêciu rozdzia³ów, z których ka¿dy przedstawia kolejne kroki, które nale¿y wykonaæ, by osi¹gn¹æ zamierzony cel. Dodatkow¹ zaletê stanowi¹ liczne ilustracje. FRAGMENTY KSI¥¯EK ONLINE Opisano miêdzy innymi: • Instalacjê niezbêdnego oprogramowania • Sk³adniki jêzyka C# • Instrukcje warunkowe i pêtle • Pracê z ci¹gami znaków • Programowanie obiektowe w C# • Korzystanie z tablic i kolekcji • Delegaty, zdarzenie, obs³ugê b³êdów • Tworzenie dynamicznych serwisów WWW w jêzyku C# Programista chc¹cy tworzyæ zaawansowane aplikacje internetowe ma wybór pomiêdzy dwoma platformami: Java 2 EE Suna i .NET Microsoftu. Je li wybierze tê drug¹, dziêki Wydawnictwo Helion ksi¹¿ce „C# i ASP.NET. Szybki start” szybko bêdzie móg³ tworzyæ funkcjonalne ul. Chopina 6 aplikacje WWW w nowym, ekscytuj¹cym jêzyku C#. 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl
  • 2. Spis treści Spis treści Wstęp 11 Rozdział 1. Zaczynamy 23 Jak zdobyć C# ...........................................................................................24 Instalowanie IIS.........................................................................................26 Tworzenie projektu aplikacji sieciowej w Visual Studio .NET ................28 Uruchamianie projektów sieciowych za pomocą Visual Studio .NET........ 31 Pisanie prostej strony ASP .NET ..............................................................33 Wyszukiwanie błędów w aplikacjach ASP .NET .....................................35 Ręczne uruchamianie kompilatora ............................................................38 Kompilowanie i uruchamianie programów C# bez pomocy VS.NET ........ 39 Wyszukiwanie błędów w programach bez pomocy VS.NET ...................41 Spis treści Rozdział 2. Składniki języka C# 43 Praca z elementami języka ........................................................................44 Pisanie kodu C#.........................................................................................48 Deklarowanie zmiennych ..........................................................................50 Definiowanie stałych.................................................................................53 Grupowanie stałych w typy wyliczeniowe................................................54 Deklarowanie funkcji ................................................................................56 Deklarowanie funkcji z parametrami ........................................................58 Zwracanie wartości funkcji .......................................................................62 Definiowanie klas......................................................................................64 Dodawanie klas do przykładowej aplikacji...............................................67 Tworzenie i stosowanie obiektów .............................................................68 Tworzenie obiektów w przykładowej aplikacji.........................................70 Włączanie definicji klas ze źródeł zewnętrznych......................................71 Grupowanie klas w przestrzeniach nazw ..................................................74 Dodawanie pól do klas ..............................................................................78 Inicjalizowanie pól w momencie ich deklarowania ...................................79 Dodawanie właściwości do klas................................................................80 5
  • 3. Spis treści Dodawanie metod do klasy .......................................................................86 Dodawanie składowych do klas przykładowego programu ......................89 Uruchamianie przykładowej aplikacji.......................................................90 Dodawanie komentarzy.............................................................................95 Kierunki parametrów w typach referencyjnych ........................................97 Rozdział 3. Wyrażenia warunkowe i pętle 99 Praca z pętlami i warunkami ...................................................................100 Porównywanie typów numerycznych .....................................................104 Porównywanie typów referencyjnych .....................................................105 Łączenie porównań .................................................................................109 Instrukcje warunkowe .............................................................................110 Sprawdzanie wielu warunków za pomocą instrukcji switch ...................112 Operator warunku....................................................................................114 Dodawanie instrukcji warunkowych do przykładowego programu ........115 Stosowanie pętli while ............................................................................122 Stosowanie pętli do .................................................................................123 Spis treści Stosowanie pętli for.................................................................................124 Zakończenie i kontynuacja pętli..............................................................126 Dodawanie pętli do przykładowego programu........................................129 Rozdział 4. Ciągi znaków 133 Przygotowanie komputera do pracy z ciągami znaków ..........................135 Praca z ciągami znaków ..........................................................................137 Inicjalizowanie ciągów znaków ..............................................................140 Porównywanie ciągów znaków ...............................................................142 Łączenie ciągów znaków.........................................................................145 Określanie długości ciągu znaków ..........................................................147 Porównywanie i łączenie ciągów znaków w przykładowej aplikacji........ 148 Tworzenie ciągów z pojedynczych znaków ............................................151 Znaki specjalne........................................................................................154 Stosowanie ciągów literałów...................................................................156 Dostęp do poszczególnych znaków ciągu ...............................................158 Wyszukiwanie podciągów wewnątrz ciągów znaków ............................159 Pobieranie wycinka ciągu........................................................................160 Dzielenie ciągu znaków...........................................................................161 Składanie ciągów.....................................................................................163 6
  • 4. Spis treści Zamiana liter na małe lub wielkie ...........................................................164 Formatowanie ciągów znaków................................................................165 Uruchomienie przykładowej aplikacji.....................................................166 Zamiana obiektów na ciągi znaków ........................................................171 Tworzenie ciągów znaków za pomocą klasy StringBuilder .....................172 Rozdział 5. Dziedziczenie klas 173 Praca z dziedziczeniem klas ....................................................................174 Dziedziczenie z innej klasy .....................................................................177 Udostępnianie składowych klas i ograniczanie dostępu do nich.............180 Rozbudowa przykładowej aplikacji ........................................................183 Ukrywanie metod klasy bazowej ............................................................188 Pokrywanie funkcji w klasie wywiedzionej ............................................190 Dodawanie standardowego klawisza do przykładowej aplikacji ............194 Stosowanie nowego klawisza na formularzu WorkOrder .......................197 Dodawanie funkcji, które muszą zostać pokryte.....................................200 Wymóg dziedziczenia .............................................................................201 Spis treści Blokowanie dziedziczenia.......................................................................202 Rozdział 6. Składowe specjalne 203 Dodawanie wielu funkcji o takich samych nazwach, czyli przecią anie funkcji........................................................................204 Definiowane funkcji o zmiennej liczbie parametrów .................................207 Dodawanie konstruktorów ......................................................................209 Wywoływanie konstruktora klasy bazowej.............................................210 Dodawanie finalizerów ...........................................................................212 Tworzenie bibliotek kodu za pomocą składowych statycznych..............213 Zmiana znaczenia operatora (przecią anie operatorów) .........................216 Definiowanie równowa ności klas przez przecią enie operatora równości ..................................................................................220 Definiowanie równowa ności klas przez pokrycie funkcji Equals .........222 Praca ze składowymi specjalnymi...........................................................224 Rozdział 7. Typy 229 Działania z typami...................................................................................230 Uzyskiwanie typu klasy ..........................................................................234 Sprawdzanie zgodności typów ................................................................236 7
  • 5. Spis treści Konwersja jednego typu na inny .............................................................237 Rozwinięcie przykładowej aplikacji .......................................................240 Definiowanie reguł konwersji (przecią anie operatora konwersji) ........... 246 Rozdział 8. Interfejsy 249 Działania z interfejsami...........................................................................251 Definiowanie interfejsów ........................................................................255 Niejawna implementacja składowych interfejsu .....................................257 Jawna implementacja składowych interfejsu ..........................................260 Usprawnianie przykładowej aplikacji .....................................................261 Wykorzystanie obiektów poprzez interfejsy ...........................................268 Rozpoznawanie interfejsu .......................................................................269 Wykorzystanie interfejsów do polimorfizmu..........................................271 Interfejs będący pochodną innego interfejsu...........................................272 Refaktoryzacja.........................................................................................274 Ponowna implementacja interfejsów w klasie pochodnej.......................275 Kończymy przykładową aplikację ..........................................................277 Spis treści Rozdział 9. Tablice i kolekcje 279 Działania z tablicami i kolekcjami ..........................................................281 Tworzenie tablic wartości .......................................................................285 Tworzenie tablic typów referencyjnych ..................................................287 Poruszanie się po tablicy .........................................................................291 Inicjowanie elementów tablicy w miejscu ..............................................294 Tworzenie tablic wielowymiarowych .....................................................296 Usprawnianie przykładowej aplikacji .....................................................298 Odnajdywanie elementów tablicy za pomocą wyszukiwania liniowego.......................................................... 301 Sortowanie tablic.....................................................................................304 Odnajdywanie elementów tablicy za pomocą wyszukiwania binarnego.......................................................... 307 Klasy działające jak tablice (definiowanie indeksatorów) ......................309 Wprowadzenie indeksatorów do przykładowej aplikacji........................312 Kopiowanie tablic ...................................................................................313 Tworzenie list dynamicznych..................................................................314 Tworzenie kolejek ...................................................................................316 8
  • 6. Spis treści Tworzenie stosów....................................................................................317 Tworzenie tabel mieszających.................................................................318 Przeglądanie elementów tabel mieszających...........................................320 Kończymy przykładową aplikację ..........................................................321 Testowanie kontrolki CodeGridWeb.......................................................323 Rozdział 10. Delegaty i zdarzenia 325 Działania z delegatami i zdarzeniami......................................................327 Deklarowanie delegatów .........................................................................330 Tworzenie i wywoływanie delegatów .....................................................331 Łączenie delegatów .................................................................................333 Odłączanie delegatów .............................................................................334 Deklarowanie i wyzwalanie zdarzeń .......................................................336 Deklarowanie zdarzeń przyjaznych dla WWW ......................................338 Subskrypcja zdarzeń................................................................................340 Asynchroniczne wyzwalanie delegatów .................................................342 Oczekiwanie na zakończenie działania delegatów asynchronicznych ...... 346 Spis treści Pobieranie wyników działania delegatów asynchronicznych .................348 Kończymy przykładową aplikację ..........................................................350 Rozdział 11. Obsługa błędów 353 Wykonywanie działań z wyjątkami ........................................................354 Przechwytywanie wyjątków....................................................................360 Przechwytywanie wybranych wyjątków .................................................363 Uzyskiwanie informacji o wyjątku..........................................................366 Działania z łańcuchami wyjątków...........................................................368 Deklarowanie własnych wyjątków..........................................................372 Definiowanie komunikatów o błędach....................................................374 Zgłaszanie wyjątku..................................................................................375 Przechwytywanie i ponowne zgłaszanie wyjątków ................................376 Tworzenie łańcucha wyjątków................................................................377 Wprowadzanie kodu, który wykonuje się przed zakończeniem działania funkcji.....................378 Zastosowanie słowa kluczowego using...................................................380 Wprowadzanie zabezpieczeń formularzy do przykładowej aplikacji........ 382 Obsługa nieobsłu onych błędów w aplikacjach WWW .........................385 9
  • 7. Spis treści Rozdział 12. Odbicia i atrybuty 389 Działania z odbiciami i atrybutami .........................................................390 Identyfikacja kompilata...........................................................................394 Działania z wyświetlanymi nazwami ......................................................395 Działania z ciągami znaków opisu ście ek .............................................398 Dynamiczne ładowanie programu na podstawie nazwy wyświetlanej...... 399 Dynamiczne ładowanie programu na podstawie ście ki dostępu ...........400 Tworzenie egzemplarza klasy w kompilacie...........................................401 Uzyskiwanie listy klas w kompilacie ......................................................403 Wyszczególnienie składowych klasy ......................................................404 Dynamiczne ustawianie lub pobieranie pól.............................................406 Dynamiczne wywoływanie metody ........................................................409 Kończymy zadanie pierwsze w przykładowej aplikacji..........................411 Stosowanie atrybutów kodu ....................................................................413 Definiowanie atrybutów ..........................................................................414 Wyszukiwanie atrybutów w kodzie ........................................................417 Kończymy zadanie drugie w przykładowej aplikacji..............................420 Spis treści Rozdział 13. Projekty WWW w języku C# 423 Tworzenie projektu DLL za pomocą Visual Studio .NET ......................424 Odwoływanie się do kodu DLL i jego wykonywanie .............................428 Udostępnianie bibliotek DLL do globalnego wykorzystania ..................429 Tworzenie serwisów WWW ...................................................................432 Wykorzystywanie serwisów WWW .......................................................436 Skorowidz 439 10
  • 8. Interfejsy Interfejsy Interfejsy Interfejsy to typy pozwalające na definiowanie wielu klas spełniających podobne funkcje. Wyobraźmy sobie klasę 'UEQTV. W klasie 'UEQTV są takie metody, jak: ,CFC, <CVT[OCPKG, 1FVYCTCPKG/W[MK itp. U ytkownik jest zadowolony z klasy 'UEQTV, poniewa umo liwia mu ona dojazdy do pracy i z powrotem. W pewnym momencie jego koledzy zaczęli jednak artować z klasy 'UEQTV, dlatego postanowił zastąpić ją klasą (GTTCTK. Przed zastąpieniem klasy 'UEQTV klasą (GTTCTK u ytkownik chce mieć jednak pewność, e klasa ta spełnia co najmniej takie same funkcje, co klasa Escort. Musi więc oferować metody ,CFC, <CVT[OCPKG, 1FVYCTCPKG/W[MK. Wszystkie te działania mogą być wykonywane inaczej ni w klasie 'UEQTV, Interfejsy ale wa ne jest, aby istniały co najmniej takie same metody. Ich zestaw nazywa się interfejsem. Interfejs mo e np. nosić nazwę +5COQEJQF. Wszystkie samochody, aby mogły być tak nazywane, będą musiały zawierać implementację interfejsu +5COQEJQF (przynajmniej z naszego punktu widzenia). W świecie, w którym yjemy, obowiązują zasady interfejsów. Implementacjami podobnych interfejsów są, na przykład, .WFKG. Wielu z nas oddycha i je (jeśli ktoś się z tym nie zgadza, proszę natychmiast przestać czytać tę ksią kę). Ka dy egzemplarz klasy .WFKG mo e w inny sposób oddychać lub jeść, ale, niezale nie od tego, takie firmy, jak np. McDonald będą mogły odnosić sukcesy tylko wtedy, gdy zostanie wykonana metoda ,GFGPKG nale ąca do interfejsu +%NQYKGM. 249
  • 9. Rozdział 8. W terminologii języka C# interfejsy są typami. W stosunku do definicji interfejsów w języku C++ ró nią się tym, e nie są to wyspecjalizowane klasy. Są to natomiast oddzielne typy. Zgodnie z podstawową definicją, interfejs jest zbiorem definicji funkcji (tylko definicji, bez kodu implementacji). Funkcje te same w sobie nie wykonują adnych działań. Przypominają interfejs +%NQYKGM bez konkretnego egzemplarza człowieka — to tylko pojęcie, a nie rzeczywista implementacja. Aby mo na było skorzystać z interfejsu, nale y go zaimplementować w obrębie klasy. Kiedy klasa implementuje interfejs, ogłasza wszem i wobec, e obsługuje wszystkie zdefiniowane w nim metody. Je eli sprzedawca u ywanych samochodów twierdzi, e jego towar jest implementacją interfejsu +5COQEJQF, to tak samo, jakby mówił, e zawiera co najmniej metody: ,CFC, <CVT[OCPKG, 1FVYCTCPKG/W[MK. Je eli któraś z metod interfejsu nie zostanie zaimplementowana, kompilator języka C# zgłosi błąd. Interfejsy Zastosowanie interfejsów pozwala programistom pisać kod wykorzystujący funkcje i nie martwić się ich implementacją. Dzięki temu mo na rozpocząć od jakiejś implementacji, a potem całkowicie ją zastąpić bez konieczności przepisywania kodu. Sprawdza się to w przypadku interfejsu +5COQEJQF. Kierowcy nie uczą się prowadzenia konkretnego samochodu — uczą się prowadzić dowolny samochód, poniewa wszystkie samochody realizują ten sam, podstawowy interfejs. Posłu my się, jako przykładem rzeczywistego zastosowania interfejsów, technologią ADO .NET, która pozwala na realizację połączenia z bazą danych. Firma Microsoft, mo na w to wierzyć lub nie, nie ma zamiaru wymuszać u ycia tylko jednej bazy danych. Zamiast zmuszać do u ycia tego samego zestawu klas, zdefiniowała interfejs funkcji umo liwiających zrealizowanie połączenia z bazą danych. Producenci baz danych mają więc mo liwość napisania klas będących implementacją tego interfejsu. Idea kodowania z wykorzystaniem interfejsów polega na tym, e mo na zmienić wykorzystywany pakiet bazy danych bez konieczności przepisywania aplikacji. 250
  • 10. Interfejsy Działania z interfejsami Jako przykładową aplikację w tym rozdziale napiszemy moduł ASP .NET. Nie będzie to aplikacja bardzo rozbudowana, ale za to będzie ją mo na wykorzystać w rzeczywistych aplikacjach (w tym rozdziale nie będzie aplikacji dotyczącej supermenów). A zatem, czym jest moduł ASP .NET? Moduł jest klasą, która mo e przechwytywać ądania dowolnych stron w aplikacji. Moduły wykorzystuje się do wykonywania takich działań, jak np. testy zabezpieczeń. Mogą one przechwycić ka de ądanie i albo je zatrzymać, albo kontynuować lub te zmodyfikować w pewien sposób. Moduły mogą tak e wykonywać działania po obsłudze ądania przez odpowiednią stronę. Programistom Działania z interfejsami doświadczonym w programowaniu aplikacji WWW z pewnością pomo e wyjaśnienie, e moduły są odpowiednikiem filtrów IIS w środowisku .NET. Celem modułu, który utworzymy, będzie dostarczenie wszystkim stronom informacji o rozmiarach obszaru klienta w przeglądarce. Obszar klienta w przeglądarce to miejsce, w którym jest wyświetlana strona WWW (wewnątrz okna przeglądarki, bez pasków menu i stanu). Interesujące, e środowisko .NET nie przekazuje tych wymiarów za pośrednictwem adnej z właściwości. Mo na jednak uzyskać te wielkości za pomocą skryptów działających po stronie serwera (VBScript lub JavaScript działające na komputerze-kliencie, a nie na serwerze tak, jak strony ASP). Mo na zapytać, dlaczego interesują nas te wymiary? Otó są nam potrzebne, poniewa czasami chcemy zastosować grafikę o mniejszych wymiarach, jeśli wymiary okna są mniejsze lub większych wymiarach, jeśli wymiary okna są większe. 251
  • 11. Rozdział 8. Rozwiązanie problemu jest następujące. Kiedy klient za ąda strony po raz pierwszy, moduł zatrzyma ądanie i zwróci stronę z odpowiednim skryptem działającym po stronie klienta. Zadaniem skryptu będzie określenie wymiarów obszaru klienta. Skrypt zapisze wymiary w ukrytym polu, a następnie za ąda natychmiast tej samej strony, której klient ądał poprzednio. Wysłanie skryptu działającego po stronie klienta i zwrócenie pierwotnie ądanej strony powinno nastąpić na tyle szybko, aby u ytkownik niczego nie zauwa ył. Za drugim razem, gdy moduł otrzyma ądanie tej samej strony (teraz za ąda Rysunek 8.1. Do utworzenia modułu potrzebny jest jej skrypt działający po stronie klienta), tylko projekt biblioteki, a nie cały projekt WWW moduł odnajdzie ukryte pola zawierające ASP .NET. Jednak utworzenie projektu WWW wymiary, utworzy niewielki obiekt słu ący ASP .NET pozwala na napisanie i przetestowanie do przechowywania potrzebnych informacji modułu w jednym projekcie i przeka e je do ądanej strony. Strona pobierze obiekt z informacjami i zwróci wynik do klienta, Działania z interfejsami który wykorzysta informacje o rozmiarze obszaru klienta. W naszym przypadku na stronie wymiary wyświetlone zostaną w polach tekstowych. Aby napisać moduł: 1. Uruchom Visual Studio .NET (Start/ Programy/Microsoft Visual Studio .NET). 2. Wybierz polecenie File/New/Project. Na ekranie pojawi się okno dialogowe New Project. 3. W panelu Project Types po lewej stronie okna New Project kliknij folder Visual C# projects. 4. Zaznacz ikonę ASP .NET Web Application i zmień nazwę aplikacji na interfacesproject (rysunek 8.1). 5. Program Visual Studio utworzy nowy projekt i otworzy formularz WebForm1.aspx. 6. Zmień nazwę formularza na dimensions.aspx. W tym celu wybierz polecenie View/Solution Explorer z górnego paska menu. 252
  • 12. Interfejsy 7. Kliknij prawym klawiszem myszy formularz dimensions.aspx i wybierz polecenie Properties. W tabelce właściwości, pokazanej poni ej na rysunku 8.2, zmień właściwość FileName z WebForm1.aspx na dimensions.aspx. 8. Zmodyfikuj formularz dimension.aspx w taki sposób, aby wyglądał tak, jak formularz pokazany na rysunku 8.3. Oczywiście, w ręczne wykonanie tego zadanie trzeba wło yć wiele pracy. Zamiast tego mo esz wprowadzić kod HTML bezpośrednio w edytorze. Na rysunku 8.4, na następnej stronie, zaprezentowano kod HTML niezbędny do utworzenia formularza. Aby bezpośrednio wprowadzić kod HTML, kliknij przycisk HTML w oknie edytora. Alternatywnie mo esz pobrać plik szkieletu dla tego projektu Działania z interfejsami (patrz „Wskazówki” na następnej stronie). Rysunek 8.2. Zmiana nazwy pliku nie powinna sprawiać teraz adnych problemów Rysunek 8.3. Bardzo prosty formularz, który łatwo utworzyć od nowa. Zawiera dwie etykiety, dwa pola tekstowe oraz jedno łącze 253
  • 13. Rozdział 8. Wskazówki Rysunek 8.4. Kod HTML pokazany na tym rysunku mo na wykorzystać jako wzorzec. Dzięki formularzowi To, co do tej pory zrobiliśmy w przykładowej mo liwe jest uzyskanie informacji o wymiarach aplikacji, nie ma nic wspólnego z modułem i pozycji wszystkich elementów sterujących u ytkownika. Formularz projektowany w tym podrozdziale zostanie u yty 2CIG NCPIWCIG E do przetestowania modułu. Kod modułu %QFGDGJKPF FKOGPUKQPUCURZEU zostanie dodany natychmiast po tym, jak #WVQ'XGPV9KTGWR HCNUG dowiemy się czegoś na temat implementacji +PJGTKVU interfejsów. KPVGTHCEGURTQLGEV9GD(QTO *6/. Podobnie jak w przypadku innych projektów *'# w tej ksią ce, utworzenie projektu nie VKVNG 9GD(QTOVKVNG jest konieczne do poznania pojęć *'# DQF[ /5A215+6+10+0) )TKF.C[QWV zaprezentowanych w niniejszym rozdziale. HQTO KF (QTO OGVJQF RQUV Szkielety wszystkich projektów mo na TWPCV UGTXGT CURNCDGN KF NDN9KFVJ pobrać z witryny WWW Wydawnictwa UV[NG +0': .'(6 Peachpit pod adresem http://www.peachpit. RZ com/vqs/csharp. 215+6+10 CDUQNWVG 612 RZ Działania z interfejsami TWPCV UGTXGT 5GTQMQ è CURNCDGN CURNCDGN KF NDN*GKIJV UV[NG +0': .'(6 RZ 215+6+10 CDUQNWVG 612 RZ TWPCV UGTXGT 9[UQMQ è CURNCDGN CURVGZVDQZ KF VZV9KFVJ UV[NG +0': .'(6 RZ 215+6+10 CDUQNWVG 612 RZ TWPCV UGTXGT CURVGZVDQZ CURVGZVDQZ KF VZV*GKIJV UV[NG +0': .'(6 RZ 215+6+10 CDUQNWVG 612 RZ TWPCV UGTXGT CURVGZVDQZ CURJ[RGTNKPM KF NPM5GNH UV[NG +0': .'(6 RZ 215+6+10 CDUQNWVG 612 RZ TWPCV UGTXGT 0CXKICVG7TN FKOGPUKQPUCURZ 1F YKG CURJ[RGTNKPM HQTO DQF[ *6/. 254
  • 14. Interfejsy Tabela 8.1. Składowe interfejsu (składowe, które mo na wprowadzić do definicji interfejsu) Definiowanie interfejsów Nazwa Przykład Interfejsy definiuje się za pomocą słowa Metoda UVTKPI /GVJQF kluczowego KPVGTHCEG. Dla interfejsów mo na Właściwość KPV #IG] IGV UGV_ definiować metody, właściwości, delegaty, Właściwość tylko KPV #IG]IGV_ zdarzenia itp. Ka dy z elementów wewnątrz do odczytu interfejsu musi być jednak tylko deklaracją Indeks NQPI VJKU=KPV elementu i nie mo e zawierać implementacji. KPFGZ?]IGV UGV_ Zdarzenie GXGPV 'XGPV*CPFNGT Aby zdefiniować interfejs: 1P%NKEM 1. Wpisz słowo kluczowe RWDNKE lub KPVGTPCN, w zale ności od zasięgu, jaki ma mieć interfejs. Rysunek 8.5. Składowe interfejsu to tylko definicje, które nie zawierają kodu. W definicjach nie stosuje 2. Wprowadź słowo kluczowe KPVGTHCEG, się tak e modyfikatorów dostępu — wszystkie a po nim spację. metody interfejsu są publiczne 3. Wpisz nazwę interfejsu. 4. Otwórz nawias klamrowy ]. Definiowanie interfejsów RWDNKE KPVGTHCEG +*WOCP ] 5. Wprowadź definicje składowych (tabela 8.1). UVTKPI 0COG ] IGV _ właściwość tylko do odczytu 6. Zamknij nawias klamrowy _ (rysunek 8.5). XQKF 'CV KPV #OQWPV metoda XQKF $TGCVJG metoda _ 255
  • 15. Rozdział 8. Wskazówki Rysunek 8.6. Po zdefiniowaniu interfejsu mo na go wykorzystać jako typ danych w deklaracjach Wszystkie metody interfejsu z definicji są zmiennych lub parametrów publiczne — w definicji metody nie mo na wprowadzić modyfikatorów dostępu ENCUU CKN[4QWVKPG (dotyczy to tak e modyfikatora RWDNKE). ] Danych typu interfejsu mo na u yć XQKF 6CUMU ] w definicjach parametrów lub zmiennych +*WOCP OCP (rysunek 8.6). W przypadku interfejsów +*WOCP YQOCP nie mo na jednak tworzyć nowych _ egzemplarzy — na przykład nie mo na napisać PGY +#EEQWPV. RWDNKE XQKF )Q6QKPPGT +*WOCP RGTUQP ] W interfejsach mo na przecią ać metody RGTUQP 'CV (rysunek 8.7). _ _ Je eli jakiś programista u yje interfejsu, najlepiej nie zmieniać jego definicji. Rysunek 8.7. Przecią anie metod to mo liwość W przeciwnym razie istnieje ryzyko, istnienia kilku metod o tej samej nazwie. Definiowanie interfejsów e napisany program przestanie działać. Pamiętaj, e mo na to zrobić tylko pod warunkiem, W takiej sytuacji najlepiej zdefiniować nowy e zmieni się liczbę parametrów lub zmodyfikuje interfejs. Więcej informacji na ten temat typ jednego z nich znajdzie się w dalszej części tego rozdziału, w podrozdziale „Tworzenie interfejsów RWDNKE KPVGTHCEG +*WOCP pochodnych od innych interfejsów”. ] UVTKPI 0COG ]IGV _ właściwość tylko do odczytu XQKF 'CV KPV #OQWPV metoda XQKF 'CV UVTKPI HQQF6[RG KPV #OQWPV przecią anie _ 256
  • 16. Interfejsy Rysunek 8.8. Implementacja interfejsu przypomina dziedziczenie. W przypadku metody niejawnej Niejawna implementacja wystarczy zaimplementować składowe interfejsu jako metody publiczne składowych interfejsu Interfejsy są implementowane przez klasy. RWDNKE KPVGTHCEG +*WOCP Zaimplementowanie interfejsu oznacza ] wprowadzenie kodu dla wszystkich UVTKPI 0COG ]IGV _ XQKF 5NGGR UJQTV JQWTU zdefiniowanych w nim metod. Kompilator _ wymusza wprowadzenie kodu dla wszystkich metod bez wyjątku. Wynika to stąd, RWDNKE ENCUU 2GTUQP +*WOCP e programista wykorzystujący interfejs ] spodziewa się, e klasa implementująca RWDNKE UVTKPI 0COG interfejs będzie zawierać definicje wszystkich ] IGV zawartych w nim metod. Istnieją dwa ] mechanizmy implementowania interfejsów TGVWTP 2CWN w klasie: mechanizm niejawny i jawny. Niejawna implementacja składowych _ Najpierw zaprezentujemy mechanizm niejawny. _ RWDNKE XQKF 5NGGR UJQTV JQWTU Aby zaimplementować interfejs ] w sposób niejawny: HQT UJQTV EQWPVGT EQWPVGTJQWTU EQWPVGT 1. Po nazwie klasy, która będzie implementować ] interfejs, wpisz dwukropek, a po nim nazwę *VVR%QPVGZV EQPVGZV interfejsu, który będzie implementowany. *VVR%QPVGZV%WTTGPV EQPVGZV4GURQPUG9TKVG %JTCRKG 2. Wprowadź składowe odpowiadające _ wszystkim składowym interfejsu. _ _ 3. Oznacz metody implementacyjne jako publiczne. 4. Wpisz kod składowych interfejsu (rysunek 8.8). 257
  • 17. Rozdział 8. Wskazówki Rysunek 8.9. Klasa Person implementuje zarówno interfejs IHuman, jak i IManager. Ten mechanizm implementacji interfejsu Zaimplementowanie interfejsu ustanawia relację cechuje wada polegająca na tym, e ka dą „jest”. Innymi słowy, osoba (Person) jest metodę implementacyjną nale y oznaczyć człowiekiem (Human) i mened erem (Manager) jako publiczną. Aby zaimplementować więcej ni jeden RWDNKE KPVGTHCEG +*WOCP ] interfejs, nale y oddzielić poszczególne UVTKPI 0COG ]IGV _ nazwy interfejsu przecinkiem (rysunek 8.9). XQKF 5NGGR UJQTV JQWTU _ RWDNKE KPVGTHCEG +/CPCIGT ] XQKF 5R[1P'ORNQ[GG UVTKPI PCOG DQQN +U7PCYCTG _ Niejawna implementacja składowych RWDNKE ENCUU 2GTUQP +*WOCP +/CPCIGT ] RWDNKE UVTKPI 0COG ] IGV ] TGVWTP 2CWN _ _ RWDNKE XQKF 5NGGR UJQTV JQWTU ] HQT UJQTV EQWPVGT EQWPVGTJQWTU EQWPVGT ] *VVR%QPVGZV EQPVGZV *VVR%QPVGZV%WTTGPV EQPVGZV4GURQPUG9TKVG %JTCRKG _ _ RWDNKE XQKF 5R[1P'ORNQ[GG UVTKPI PCOG DQQN +U7PCYCTG ] YJKNG +U7PCYCTG ] .QQM1XGT5JQWNFGT PCOG _ _ _ 258
  • 18. Interfejsy Rysunek 8.10. W powy szym kodzie zdefiniowano Je eli klasa jest pochodną innej klasy klasę Person, która implementuje interfejs IHuman. (nie interfejsu), najpierw nale y wymienić Następnie, biorąc pod uwagę to, e nie wszystkie klasę, która nie nale y do interfejsu, osoby są mened erami, zdefiniowano klasę a następnie implementowane interfejsy. opisującą mened erów. Jednak, ze względu na to, e mened erowie są ludźmi (persons), klasa Wszystkie te elementy trzeba oddzielić ta dziedziczy wszystkie składowe klasy Person przecinkami (rysunek 8.10). (zasada dziedziczenia). Na końcu znajduje się implementacja interfejsu IManager RWDNKE KPVGTHCEG +*WOCP ] UVTKPI 0COG ]IGV _ XQKF 5NGGR UJQTV JQWTU _ RWDNKE KPVGTHCEG +/CPCIGT Niejawna implementacja składowych ] XQKF 5R[1P'ORNQ[GG UVTKPI PCOG DQQN +U7PCYCTG _ RWDNKE ENCUU 2GTUQP +*WOCP ] RWDNKE UVTKPI 0COG ] IGV ] TGVWTP 2CWN _ _ RWDNKE XQKF 5NGGR UJQTV JQWTU ] HQT UJQTV EQWPVGT EQWPVGTJQWTU EQWPVGT ] *VVR%QPVGZV EQPVGZV *VVR%QPVGZV%WTTGPV EQPVGZV4GURQPUG9TKVG %JTCRKG _ _ _ RWDNKE ENCUU /CPCIGT 2GTUQP +/CPCIGT RWDNKE XQKF 5R[1P'ORNQ[GG UVTKPI PCOG DQQN +U7PCYCTG ] YJKNG +U7PCYCTG ] .QQM1XGT5JQWNFGT PCOG _ _ _ 259
  • 19. Rozdział 8. Rysunek 8.11. W przypadku jawnego Jawna implementacja implementowania interfejsu nie wprowadza się składowych interfejsu modyfikatorów dostępu. Nale y wpisać nazwę interfejsu, po nim kropkę, a po niej nazwę metody Podczas implementowania interfejsu przez wprowadzanie składowych publicznych RWDNKE KPVGTHCEG +*WOCP powstaje problem polegający na tym, e czasami ] dwa interfejsy zawierają metodę o takiej samej UVTKPI 0COG ]IGV _ nazwie i takich samych parametrach, XQKF 5NGGR UJQTV JQWTU ale konieczne jest zaimplementowanie tych _ metod na dwa ró ne sposoby. W przypadku RWDNKE ENCUU 2GTUQP +*WOCP zastosowania metody niejawnej jedna metoda ] publiczna będzie stanowiła implementację UVTKPI +*WOCP0COG metod o takiej samej nazwie i tym samym ] zbiorze parametrów dla wszystkich interfejsów. IGV Metoda jawna umo liwia poinformowanie ] TGVWTP 2CWN kompilatora o tym, którą metodę, którego _ Jawna implementacja składowych interfejsu mieliśmy zamiar zaimplementować. _ Aby jawnie zaimplementować XQKF +*WOCP5NGGR UJQTV JQWTU ] interfejs: HQT UJQTV EQWPVGT 1. Po nazwie klasy, która będzie implementować EQWPVGTJQWTU EQWPVGT ] interfejs, wpisz dwukropek, a po nim nazwę *VVR%QPVGZV EQPVGZV interfejsu, który będzie implementowany. *VVR%QPVGZV%WTTGPV EQPVGZV4GURQPUG9TKVG %JTCRKG 2. Wpisz typ zwracanej wartości dla składowej _ interfejsu. _ _ 3. Wpisz +0CYC+PVGTHGLUW/GVQFC+PVGTHGLUW. Mówiąc inaczej, wpisz nazwę interfejsu, po nim kropkę, a po niej nazwę metody interfejsu. 4. Wprowadź parametry składowej interfejsu. 5. Wpisz kod składowej interfejsu (rysunek 8.11). Wskazówka Wszystkie metody implementowane w ten sposób są prywatne. Nie mo na wprowadzić modyfikatora dostępu na początku definicji. 260
  • 20. Interfejsy Usprawnianie przykładowej aplikacji Teraz, kiedy wiemy ju , w jaki sposób definiuje się interfejsy oraz jak nale y implementować interfejsy za pomocą klas, czas usprawnić przykładową aplikację. Dokładniej rzecz ujmując, zdefiniujemy klasę, która będzie słu yć jako moduł u ytkownika. Aby przekształcić klasę w moduł, nale y zaimplementować w niej interfejs 5[UVGO9GD+*VVR/QFWNG. Jego zaimplementowanie nie jest trudne — zawiera tylko dwie metody: +PKV i KURQUG. Środowisko ASP .NET wywołuje metodę +PKV w momencie, gdy moduł jest po raz pierwszy ładowany Usprawnianie przykładowej aplikacji do pamięci. Metoda KURQUG wywoływana jest w momencie usuwania modułu z pamięci. Jedyna trudność polega na wykorzystaniu zdarzenia. Zdarzenia zostaną opisane w rozdziale 10. „Delegaty i zdarzenia”. Nie zamierzamy poświęcać w tym rozdziale wiele miejsca na tłumaczenie, czym jest zdarzenie. Na razie wystarczy, abyśmy wiedzieli, e zdarzenie jest metodą wywoływaną w wyniku działania. Implementacja zdarzeń pod wieloma względami przypomina implementację interfejsów. Ró nica polega na tym, e interfejs mo e zawierać kilka metod, natomiast zdarzenie zawiera tylko jedną metodę. Przykładem zdarzenia jest kliknięcie przycisku. Klasa ąda od zdarzenia ENKEM informacji od przycisku formularza. Kiedy u ytkownik kliknie przycisk, serwer informuje klasę, e miało miejsce zdarzenie. Moduł mo na wykorzystać np. do nasłuchiwania wystąpienia zdarzenia $GIKP4GSWGUV. Środowisko ASP .NET wyzwala to zdarzenie za ka dym razem, gdy przeglądarka klienta za ąda strony. 261
  • 21. Rozdział 8. Aby zdefiniować klasę modułu użytkownika: 1. Z paska menu wybierz polecenie Project/ Add class. Wpisz custommodule.cs jako nazwę klasy i wciśnij Enter (rysunek 8.12). 2. W górnej części kodu modułu, poni ej wiersza o treści WUKPI 5[UVGO, wpisz wiersz WUKPI 5[UVGO9GD. 3. W wierszu w postaci: RWDNKE ENCUU EWUVQOOQFWNG dodaj na końcu: +*VVR/QFWNG tak, aby wiersz ten przyjął postać: RWDNKE Rysunek 8.12. Wszystkie właściwości funkcjonalne ENCUU EWUVQOOQFWNG +*VVR/QFWNG. modułu u ytkownika zostaną zaimplementowane w klasie custommodule. Dzięki wykorzystaniu okna 4. Teraz trzeba trochę „pooszukiwać”. dialogowego pokazanego na rysunku u yjemy Usprawnianie przykładowej aplikacji W systemie Visual Studio .NET znajduje się kreatora do wygenerowania szkieletu klasy kreator pozwalający na łatwą implementację interfejsu. Z menu wybierz polecenie View/Class View. 5. W oknie Class View rozwiń folder interfacesproject/custommodule/Bases and interfaces. Kliknij prawym klawiszem myszy IHttpModule i z rozwijanego menu wybierz Add/Implement Interface (rysunek 8.13). Rysunek 8.13. Kreator implementacji interfejsu wykorzystuje mechanizm niejawnej implementacji. Dla ka dej składowej interfejsu definiowane są elementy publiczne 262
  • 22. Interfejsy Rysunek 8.14. Interfejs IHttpModule spełnia 6. Kreator spowoduje dodanie namiastek dwie funkcje. Po pierwsze, informuje środowisko metod +PKV i KURQUG. Kod przyjmie postać ASP .NET, e klasa jest modułem u ytkownika. widoczną na rysunku 8.14. Po drugie, środowisko zyskuje mo liwość poinformowania klasy, kiedy moduł jest ładowany 7. Dodaj do klasy metodę $GIKP4GSWGUV po raz pierwszy (metoda Init) oraz kiedy nie jest ju (rysunek 8.15). potrzebny (metoda Dispose) WUKPI 5[UVGO WUKPI 5[UVGO9GD PCOGURCEG KPVGTHCEGURTQLGEV ] UWOOCT[ Rysunek 8.15. Metoda BeginRequest nie jest częścią interfejsu IHttpModule. Jest to zdarzenie zdefiniowane Ogólny opis modułu custommodule dla klasy HttpApplication, informujące o tym, UWOOCT[ e występują ądania do dowolnej ze stron w aplikacji RWDNKE ENCUU EWUVQOOQFWNG +*VVR/QFWNG Usprawnianie przykładowej aplikacji ] RWDNKE EWUVQOOQFWNG WUKPI 5[UVGO ] WUKPI 5[UVGO9GD DO ZROBIENIA: Tutaj nale y PCOGURCEG KPVGTHCEGURTQLGEV wprowadzić logikę konstruktora ] UWOOCT[ _ Ogólny opis modułu custommodule TGIKQP +ORNGOGPVCVKQP QH +*VVR/QFWNG UWOOCT[ RWDNKE XQKF RWDNKE ENCUU EWUVQOOQFWNG +*VVR/QFWNG +PKV 5[UVGO9GD*VVR#RRNKECVKQP EQPVGZV ] ] RWDNKE EWUVQOOQFWNG _ ] RWDNKE XQKF KURQUG DO ZROBIENIA: Tutaj nale y wprowadzić ] logikę konstruktora _ GPFTGIKQP _ _ _ TGIKQP +ORNGOGPVCVKQP QH +*VVR/QFWNG RWDNKE XQKF +PKV 5[UVGO9GD*VVR#RRNKECVKQP EQPVGZV ] _ RWDNKE XQKF KURQUG ] _ GPFTGIKQP XQKF $GIKP4GSWGUV QDLGEV UGPFGT 'XGPV#TIU CTIU ] _ _ _ 263
  • 23. Rozdział 8. 8. W metodzie +PKV wprowadź kod wią ący Rysunek 8.16. Zwróć uwagę, e w celu powiązania zdarzenie $GIKP4GSWGUV z metodą klasy zdarzenia klasy z metodą do zdarzenia odwołujemy $GIKP4GSWGUV (rysunek 8.16). Nie martw się, się w taki sposób, jakby było ono właściwością je eli na razie kod ten jest niejasny, jego obiektu (obiekt.nazwazdarzenia), następnie u ywamy operatora += i przypisujemy mu nowy szczegółowe wyjaśnienie znajdzie się obiekt (delegat). Metodę przekazujemy jako w rozdziale 10. „Delegaty i zdarzenia”. parametr konstruktora obiektu WUKPI 5[UVGO WUKPI 5[UVGO9GD PCOGURCEG KPVGTHCEGURTQLGEV ] UWOOCT[ 1IÎNP[ QRKU OQFW W EWUVQOOQFWNG UWOOCT[ RWDNKE ENCUU EWUVQOOQFWNG +*VVR/QFWNG Usprawnianie przykładowej aplikacji ] RWDNKE EWUVQOOQFWNG ] DO ZROBIENIA: Tutaj nale y wprowadzić logikę konstruktora _ TGIKQP +ORNGOGPVCVKQP QH +*VVR/QFWNG RWDNKE XQKF +PKV 5[UVGO9GD*VVR#RRNKECVKQP EQPVGZV ] EQPVGZV$GIKP4GSWGUV PGY 'XGPV*CPFNGT $GIKP4GSWGUV _ RWDNKE XQKF KURQUG ] _ GPFTGIKQP XQKF $GIKP4GSWGUV QDLGEV UGPFGT 'XGPV#TIU CTIU ] _ _ _ 264
  • 24. Interfejsy Rysunek 8.17. Doceń piękno literałów znakowych. 9. Wprowadź kod w metodzie +PKV w celu Zwróć uwagę, jak łatwo — korzystając z literałów utworzenia ciągu znaków stanowiącego znakowych — mo na umieścić znaki końca wiersza skrypt działający po stronie klienta i zapisz w ciągu znaków. Po prostu formatujemy ciąg go w obiekcie #RRNKECVKQP. Pamiętaj, znaków, tak jak chcemy, umieszczając gdzie nale y znaki końca wiersza e obiekt #RRNKECVKQP jest dostępny na wszystkich stronach i dla ka dego klienta (rysunek 8.17). RWDNKE XQKF +PKV 5[UVGO9GD*VVR#RRNKECVKQP EQPVGZV ] EQPVGZV$GIKP4GSWGUV PGY 'XGPV*CPFNGT $GIKP4GSWGUV UVTKPI JVON JVON CFQYCPKG UETKRV NCPIWCIGXDUETKRV 5WD )GVKOGPUKQPU KO ENKGPV9KFVJ Usprawnianie przykładowej aplikacji KO ENKGPV*GKIJV ENKGPV9KFVJ FQEWOGPVDQF[%NKGPV9KFVJ ENKGPV*GKIJV FQEWOGPVDQF[%NKGPV*GKIJV FQEWOGPVO[HQTOVZVKOGPUKQPU8CNWG ENKGPV9KFVJ ENKGPV*GKIJV FQEWOGPVO[HQTOUWDOKV 'PF 5WD UETKRV DQF[ QP.QCF )GVKOGPUKQPU HQTO PCOG O[HQTO OGVJQF 2156 CEVKQP ]_ R KPRWV V[RG JKFFGP PCOG VZVKOGPUKQPU UKG R HQTO DQF[ JVON EQPVGZV#RRNKECVKQP= AAKUEQXGT*6/. ?JVON _ 265
  • 25. Rozdział 8. 10. Teraz, w treści metody $GIKP4GSWGUV wpisz Rysunek 8.18. Na tym rysunku znalazł się kod, kod pokazany na rysunku 8.18. Zadaniem który wymaga wyjaśnienia. Szczegółowe tego kodu jest sprawdzenie, czy są dostępne informacje na jego temat mo na znaleźć w ramce informacje o wymiarach. Informacje pt. „Szczegóły zdarzenia BeginRequest” te powinny być dostępne za pośrednictwem pola ukrytego. Je eli pole tekstowe nie istnieje, XQKF $GIKP4GSWGUV QDLGEV UGPFGT 'XGPV#TIU moduł zablokuje ądanie strony i wyśle CTIU skrypt działający po stronie klienta. Skrypt ] zarejestruje wymiary okna w ukrytym polu )NQDCN I )NQDCNUGPFGT UVTKPI FKOGPUKQPU i natychmiast za ąda strony ponownie. Moduł I4GSWGUV(QTO= VZVKOGPUKQPU ? sprawdzi, czy pole tekstowe istnieje i, je eli KH FKOGPUKQPU PWNN ^^ FKOGPUKQPU istnieje, wprowadzi wymiary do obiektu +VGO (więcej informacji na ten temat znajdzie się ] w ramce na następnej stronie). UVTKPI JVON UVTKPII%QPVGZV å#RRNKECVKQP= AAKUEQXGT*6/. ? Wskazówki UVTKPI PGY7TN UVTKPI(QTOCV JVON I4GSWGUV7TN#DUQNWVG2CVJ Usprawnianie przykładowej aplikacji Kod zaprezentowany w tym podrozdziale I4GURQPUG9TKVG PGY7TN to kompletny kod potrzebny do utworzenia I%QORNGVG4GSWGUV modułu u ytkownika. Jednak moduł ten nie _ GNUG KH będzie działać dopóty, dopóki nie uzupełnimy FKOGPUKQPU+PFGZ1H %NKGPV9KFVJ przykładu kodem pokazanym w dalszej części ] tego rozdziału. UVTKPI=? UKGU FKOGPUKQPU5RNKV KPV ENKGPV9KFVJ 5[UVGO%QPXGTV Kreator implementujący interfejsy wprowadza 6Q+PV UKGU=? kod TGIKQP +ORNGOGPVCVKQP QH +*VVR/QFWNG KPV ENKGPV*GKIJV na początku bloku metod implementacyjnych 5[UVGO%QPXGTV6Q+PV UKGU=? oraz GPFTGIKQP na końcu tego bloku. I%QPVGZV+VGOU= AA%NKGPV9KFVJ ? Te instrukcje nie dotyczą bezpośrednio ENKGPV9KFVJ kompilatora. Umo liwiają one uzyskanie I%QPVGZV+VGOU= AA%NKGPV*GKIJV ? rozwijanego kodu w edytorze. Jak mo na ENKGPV*GKIJV _ zauwa yć, w edytorze pojawi się znak minus _ z lewej strony deklaracji regionu (rysunek 8.19). Kliknięcie znaku minus w edytorze spowoduje ukrycie kodu umieszczonego w obszarze i zastąpienie znaku minus plusem (rysunek 8.20). Kliknięcie znaku plus spowoduje ponowne pojawienie się kodu. Rysunek 8.19. Instrukcja #region powoduje dodanie obszaru rozwijanego kodu. Kiedy edytor wykryje dyrektywę #region, umieszcza znak minus po lewej stronie okna kodu Rysunek 8.20. Kliknięcie znaku minus powoduje rozwinięcie kodu obszaru i wyświetlenie opisu za słowem #region, umo liwiającego identyfikację kodu. Słowo kluczowe #region w kodzie nie ma adnego znaczenia funkcjonalnego. Jest ono wykorzystywane wyłącznie przez edytor, zatem, je eli komuś wydaje się niepotrzebne, mo e je usunąć 266
  • 26. Interfejsy Szczegóły zdarzenia BeginRequest W pierwszym wierszu metody $GIKP4GSWGUV znajduje się instrukcja konwersji obiektu UGPFGT (pierwszy parametr metody) na obiekt )NQDCN. )NQDCN jest klasą generowaną przez kreator podczas tworzenia projektu ASP .NET. Jest to pochodna klasy *VVR#RRNKECVKQP. Obiekt tej klasy tworzy się za pierwszym razem, gdy dowolny klient skorzysta z dowolnej strony w aplikacji. Z obiektu )NQDCN mo na uzyskać dostęp do innych obiektów — np. 4GURQPUG lub 4GSWGUV. W drugim wierszu kodu u yto obiektu )NQDCN do uzyskania obiektu 4GSWGUV. Jak pamiętamy, obiekt 4GSWGUV umo liwia uzyskanie informacji na temat ądania klienta. Je eli skorzystamy z właściwości (QTO, mo emy uzyskać dostęp do ukrytego pola, które zostało utworzone przez skrypt działający po stronie klienta. Nazwa tego ukrytego pola to VZVKOGPUKQPU. W wierszu I4GSWGUV(QTO= VZVKOGPUKQPU ? następuje pobranie tekstu z ukrytego pola. Je eli pole nie istnieje, zwrócony wynik będzie wartością PWNN. W przeciwnym razie będą to współrzędne obszaru klienta. Skrypt działający po stronie klienta zapisuje współrzędne w postaci: szerokość;wysokość (np. 800;600). Je eli wynik wynosi PWNN, do klienta wysyłany jest skrypt za pomocą funkcji 4GURQPUG9TKVG. Potem następuje wywołanie funkcji Usprawnianie przykładowej aplikacji %QORNGVG4GSWGUV, której działanie polega na zatrzymaniu ądania strony. Je eli wymiary są dostępne, następuje rozbicie ciągu znaków o formacie szerokość;wysokość na dwie liczby i konwersja tych liczb na typ KPVGIGT. Wartości te są następnie umieszczone w obiekcie +VGOU. Do tej pory nie u ywaliśmy obiektu +VGOU, ale przypomina on obiekty 5GUUKQP oraz #RRNKECVKQP. Ogólnie rzecz biorąc, jest to jeszcze jeden sposób utrwalania informacji. Ró nica między tymi obiektami polega na czasie dostępności informacji. W obiekcie +VGOU informacje są dostępne tylko na czas trwania ądania klienta. W przypadku obiektu #RRNKECVKQP informacje są dostępne tak długo, jak serwer WWW przetwarza aplikację i mają do nich dostęp wszystkie klienty korzystające z aplikacji. Informacje zapisane w obiekcie 5GUUKQP są dostępne na czas trwania programu, ale są one specyficzne dla ka dego klienta. Obiekt +VGOU istnieje tylko na czas ądania. Je eli zatem klient przechodzi z jednej strony na drugą, informacje zostają utracone. W ramach tego samego ądania moduł mo e jednak umieścić informacje w obiekcie +VGOU i strona będzie miała do nich dostęp przez odwołanie I%QPVGZV+VGOU. 267
  • 27. Rozdział 8. Rysunek 8.21. Chocia typem zmiennej jest ICar, Wykorzystanie obiektów nie mo na napisać new ICar. Trzeba utworzyć poprzez interfejsy egzemplarz klasy implementującej interfejs. Nie mo na tworzyć egzemplarzy interfejsu Kiedy programista zdefiniuje interfejs i zaimplementuje go jako konkretną klasę, KPVGTHCEG +%CT mo e u ywać tej klasy poprzez interfejs. ] UVTKPI 4WP Aby używać klasy poprzez interfejs: UVTKPI 5VQR UVTKPI 2NC[/WUKE 1. Zdefiniuj zmienną typu interfejsu. _ Wpisz na przykład +%CT XCT. ENCUU 'UEQTV +%CT 2. Ustaw zmienną typu interfejsu na wartość ] równą klasie, która ten interfejs implementuje. RWDNKE UVTKPI 4WP Wpisz na przykład PGY 'UEQTV ] TGVWTP ,CFú VCM U[DMQ LCM WOKGO (rysunek 8.21). _ RWDNKE UVTKPI 5VQR Wskazówka ] TGVWTP ,CM FQDTG 9TGUEKG UKú OQIú Nie mo na tworzyć egzemplarzy interfejsu. Wykorzystanie obiektów CVT[OCè Interfejs jest typem abstrakcyjnym, _ co oznacza, e nie jest to klasa, której RWDNKE UVTKPI 2NC[/WUKE obiekty mo na utworzyć. Zamiast tego ] tworzy się egzemplarze klasy TGVWTP ,GUVG O[ RKTCVCOK MVÎT[ PKE implementującej interfejs. PKG TQDKæ _ _ ENCUU TKXGT ] RWDNKE UVTKPI )Q6Q9QTM ] +%CT ECT PGY 'UEQTV UVTKPI OUI OUI ECT4WP OUI ECT2NC[/WUKE OUI ECT5VQR TGVWTP OUI _ _ 268
  • 28. Interfejsy Rysunek 8.22. Zmienna obj jest typu object. Oznacza to, e mo e wskazywać na obiekt Cat Rozpoznawanie interfejsu lub na obiekt Dog. Powy szy kod testuje zawartość Przed u yciem obiektu poprzez interfejs warto zmiennej obj przez sprawdzenie, czy obiekt obj obsługuje interfejs IDog sprawdzić, czy obiekt rzeczywiście obsługuje interfejs. Oczywiście, je eli mamy dostęp do definicji klasy, mo emy na nią spojrzeć KPVGTHCEG +%CV i przekonać się, czy klasa implementuje interfejs. ] Czasami jednak mamy do czynienia z danymi UVTKPI +IPQTG1YPGT _ typu QDLGEV, dla których trzeba zweryfikować, czy obiekt, na który wskazuje zmienna, jest KPVGTHCEG +QI zgodny z interfejsem, którego chcemy u yć. ] Istnieją dwa sposoby sprawdzenia, czy obiekt UVTKPI .KUVGP6Q1YPGT obsługuje interfejs. _ ENCUU 2QQFNG +QI Aby sprawdzić, ] czy obiekt obsługuje interfejs: _ 1. Wpisz KH QDL KU +#P[VJKPI, gdzie QDL ENCUU 5KCOGUG +%CV jest zmienną wskazującą na obiekt, który Rozpoznawanie interfejsu ] chcesz sprawdzić, natomiast +#P[VJKPI _ jest nazwą interfejsu, dla którego chcesz ENCUU 1YPGT przeprowadzić test (rysunek 8.22). ] lub XQKF (GGF#PKOCN QDLGEV QDL ] Wpisz +#P[VJKPI XCT QDL CU +#P[VJKPI, KH QDL KU +QI gdzie +#P[VJKPI jest interfejsem, dla którego ] +QI FQI +QIQDL chcesz przeprowadzić test, XCT jest dowolną UVTKPI EOF FQI.KUVGP6Q1YPGT zmienną słu ącą do przechowywania _ odwołania do obiektu, a QDL jest obiektem, _ który chcesz sprawdzić. _ 269
  • 29. Rozdział 8. 2. Wpisz instrukcję KH XCT PWNN. Je eli Rysunek 8.23. Kiedy do sprawdzenia, czy obiekt po wykonaniu pierwszego kroku zmienna obsługuje interfejs, u yjemy polecenia as, uzyskamy XCT jest równa null, obiekt nie obsługuje wynik null wtedy, gdy obiekt go nie obsługuje interfejsu. Jeśli test zwróci wartość ró ną od null, obiekt obsługuje interfejs, a zmienna KPVGTHCEG +%CV XCT wskazuje na odwołanie do interfejsu ] (rysunek 8.23). UVTKPI +IPQTG1YPGT _ Wskazówki KPVGTHCEG +QI Podczas korzystania z pierwszego ] UVTKPI .KUVGP6Q1YPGT mechanizmu, po uzyskaniu informacji, _ e obiekt obsługuje interfejs, aby u yć obiektu poprzez interfejs, nale y zadeklarować ENCUU 2QQFNG +QI zmienną typu interfejsu, po czym dokonać ] konwersji obiektu na interfejs. _ W przypadku drugiego mechanizmu ENCUU 5KCOGUG +%CV rozpoznawania interfejsu, zarówno konwersja ] obiektu, jak i rozpoznanie następuje _ Rozpoznawanie interfejsu w jednym kroku. Je eli obiekt obsługuje ENCUU 1YPGT interfejs, zmienna XCT będzie wskazywać ] na obiekt, w przeciwnym razie zmienna XCT XQKF (GGF#PKOCN QDLGEV QDL przyjmie wartość null. ] +QI FQI QDL CU +QI Istnieje trzeci mechanizm rozpoznawania, KH FQI PWNN czy obiekt obsługuje interfejs. Mo na UVTKPI EOF FQI.KUVGP6Q1YPGT spróbować dokonać konwersji obiektu _ na interfejs. Je eli obiekt nie obsługuje _ interfejsu, konwersja spowoduje zgłoszenie wyjątku (błędu). Wyjątki zostaną omówione w rozdziale 11. „Obsługa błędów”. Wykorzystywanie wyjątków nie jest zalecane jako sposób rozpoznawania obsługi interfejsu przez obiekty, poniewa wyjątki mogą wpłynąć niekorzystnie na wydajność działania programu. 270