[ Pobierz całość w formacie PDF ]
W instrukcji może wystąpić deklaracja typu wyjątku obsługiwanego przez tę in- strukcję. Ta konstrukcja oraz sposób użycia więcej niż jednej instrukcji zostały pokazane w poniższym przykładzie. 5 Uwaga: Klasa ta jest klasą bazową dla kilku innych, bardziej szczegółowo opisujących błędy, na przykład wymienionych w tabeli: i przyp. tłum. 6 Ten wyjątek jest zgłaszany przy próbie odwołania się do nieistniejącej składowej. Sytuacja taka może wystąpić, gdy po kompilacji składowa klasy zdefiniowanej w zewnętrznym podzespole zostanie usunięta lub przemianowana przyp. tłum. 72 VIsuaI StudIo .NET: .NET Framework. Czarna ksIęga Jak widać, pierwsza instrukcja pozwala przechwycić wyjątki o typie , a druga wszystkie pozostałe wyjątki pochodzące od klasy . W czasie działania programu wykonywana jest pierwsza napotkana instrukcja , która odpowiada zgłoszonemu wyjątkowi. W podanym powyżej przykładzie zgłaszany jest wyjątek , tak więc wykonana zostanie pierwsza instrukcja . W rezultacie na konsoli zostanie wydrukowany następujący komunikat: Wydruk obiektu reprezentującego wyjątek zawiera wydruk komunikatu oraz zawartości stosu, co umożliwia zlokalizowanie miejsca zgłoszenia wyjątku. Blok może również zawierać instrukcję , która jest wykonywana zawsze przed wyjściem z metody, niezależnie od tego, czy wyjątek wystąpił czy też nie. Przykład: W instrukcji obsługującej wyjątek po wypisaniu komuni- katu znajduje się instrukcja powodująca wyjście z metody, ale nim ono nastąpi, wykonywana jest instrukcja . Jest ona bardzo użyteczna, jeżeli przed wyjściem z metody należy koniecznie wykonać jakieś czynności, na przykład zamknąć plik lub odświeżyć zawartość tabel bazodanowych. Gdyby nie instrukcja , trzeba by było zamieścić wiele wierszy skomplikowanego kodu. Refleksja i klasa Type W .NET można odczytać informacje o podzespole załadowanym do pamięci. Informacje te obejmują: listę klas zdefiniowanych w module, RozdzIał 2. ModeI programowanIa w środowIsku .NET 73 listę metod zdefiniowanych w klasie, nazwy i typy właściwości oraz pól, sygnatury metod. Zgodnie z oczekiwaniami, informacje te zawarte są w metadanych powiązanych z pod- zespołami i klasami. Proces odczytywania tych informacji nazywany jest refleksją (ang. reflection). Refleksja jest zaimplementowana za pomocą przestrzeni nazw i klasy , jest integralną częścią modelu programowania w środowisku .NET. Refleksja, oprócz prostego odczytywania metadanych, pozwala również dynamicznie tworzyć obiekt danego typu i wywoływać metody z tego obiektu. Jest ona mechaniz- mem używanym przez VB do realizacji póznego wiązania (ang. late binding), którego przykład pokazano w poniższym fragmencie kodu. Zadeklarowana została zmienna o ogólnym typie i za jej pomocą odwołujemy się do utworzonego obiektu. Z tego powodu kompilator VB podczas kompilacji nie ma informacji o typieobiektu, do którego się odwołujemy, a tym samym kompilator nie może sprawdzić, czy wywołanie metody jest dopuszczalne czy też nie. W czasie wyko- nywania programu środowisko uruchomieniowe CLR sprawdza używając do tego re- fleksji czy w obiekcie wskazywanym przez zmienną zdefiniowana jest metoda oraz jakie ma argumenty. Poniżej zamieszczono nieznacznie zmodyfikowany kod IL, otrzymany po kompilacji naszego programu, wyświetlony przez deasembler . Można zobaczyć, jak zapisano pózne wiązanie. W przykładzie widać, że przed wywołaniem funkcji pomocniczej ła- dowany jest napis zawierający nazwę wywoływanej funkcji . Jednym z argumentów 74 VIsuaI StudIo .NET: .NET Framework. Czarna ksIęga podawanych przy wywołaniu funkcji jest obiekt zawie- rający informacje o obiekcie, z którego wywoływana jest metoda . Główne znaczenie dla realizacji refleksji ma klasa . Za pomocą refleksji można otrzymać obiekt tej klasy dla każdego załadowanego typu. Metody, pola i właściwości obiektu klasy pozwalają odczytać wszystkie informacje o typie reprezentowanym przez ten obiekt, a nawet tworzyć obiekty tego typu. W VB można otrzymać obiekt klasy poprzez użycie operatora , jak to po- kazano poniżej. Po pobraniu obiektu klasy , można z niego odczytać informacje o typie przez niego reprezentowanym. Metoda zwraca tablicę obiektów opisują- cych składowe danego typu. Zamiast niej można użyć bardziej wyspecjalizowanych metod: , i , zwracających informacje o meto- dach, polach i właściwościach. Każda z tych metod zwraca tablicę obiektów odpowied- niego typu ( , , ). Gotowe rozwiązania Definiowanie klas Do zdefiniowania klasy w VB używane jest słowo kluczowe . Definicja klasy może zawierać pola (dane), metody, właściwości i zdarzenia. Przeciążanie i przesłanianie metod Pojęcia: przeciążanie (ang. overloading) i przesłanianie (ang. overriding) często stosowane są zamiennie, mimo że są to dwa zupełnie różne pojęcia. Jeżeli w danej klasie występują dwie (lub więcej) metody o takich samych nazwach, lecz różniące się listą argumentów, mówimy, że metody te są przeciążone. W języku VB definicja metody przeciążonej musi zawierać słowo kluczowe . RozdzIał 2. ModeI programowanIa w środowIsku .NET 75 Zdefiniowane powyżej metody różnią się listą argumentów, są więc poprawnie przeciążone. W C# i w C++ definicje metod przeciążonych nie muszą zawierać specjalnych słów klu- czowych, muszą tylko różnić się listą argumentów. Przesłanianie ma związek z dziedziczeniem i zostanie omówione w dalszej części rozdziału, w punkcie Przesłanianie metod . Definiowanie pól i metod należących do klasy W .NET można zdefiniować składowe należące do klasy, a nie do poszczególnych obiektów tej klasy. Rozważmy na przykład klasę reprezentującą rachunek bankowy. Każdy obiekt klasy (rachunek bankowy) ma saldo należące tylko do tego obiektu. W klasie może również wystąpić składowa (stopa procentowa) przecho- wująca wartość stopy procentowej wszystkich rachunków. Wartość ta jest wspólna dla wszystkich rachunków, nie różni się dla poszczególnych obiektów tej klasy z tego też powodu można powiedzieć, że zmienna przechowująca wartość stopy procentowej
[ Pobierz całość w formacie PDF ]
zanotowane.pldoc.pisz.plpdf.pisz.plmew.pev.pl
|