Tworzenie instancji klas z konstruktorami Rozdzia³ 2 Tworzenie instancji klas z konstruktorami



Podobne dokumenty
Klasa bazowa i klasy potomne - doskonalenie umiejtnoci projektowania i wykorzystania klas (45 min)

gdy wielomian p(x) jest podzielny bez reszty przez trójmian kwadratowy x rx q. W takim przypadku (5.10)

Wykład 8: klasy cz. 4

0.1 Hierarchia klas Diagram Krótkie wyjaśnienie

Aplikacje internetowe i rozproszone - laboratorium

ER RATA do ksi¹ ki "Symfonia C++ Stan dard". wydanie 3. (Zawieraj¹ca tak e czysto kosmetyczne poprawki) Sporz¹dzona 4 paÿdziernika 2009.

Dziedziczenie : Dziedziczenie to nic innego jak definiowanie nowych klas w oparciu o już istniejące.

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

ZA CZNIK C: FUNKCJE KLAWISZY I SPOSOBY WPROWADZANIA PARAMETRÓW

2. W oknie dialogowym Choose Toolbox Items w zakładce.net Framework Components naciskamy przycisk Browse...

Ćwiczenie laboratoryjne. Oprogramowanie i badanie stosu lub kolejki w środowisku Visual Basic 2005

Programowanie obiektowe

Kompozycja i dziedziczenie klas

Podstawy programowania. Ćwiczenie. Pojęcia bazowe. Języki programowania. Środowisko programowania Visual Studio

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Programowanie obiektowe

3 Delegacje. 3.1 Tworzenie delegacji. 3.2 Skojarzenie delegacji z procedurą czy funkcją

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

TEMAT : KLASY DZIEDZICZENIE

Wykład 5 Okna MDI i SDI, dziedziczenie

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Programowanie obiektowe

1. Podstawy budowania wyra e regularnych (Regex)

Wykład 5: Klasy cz. 3

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Microsoft Management Console

Tablice, DataGridView

2. Kliknij Insert->Userform. Jeżeli Toolbox nie pojawi się automatycznie, kliknij View -> Toolbox. Otrzymany widok powinien być jak poniżej.

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Instrukcja obsługi Norton Commander (NC) wersja 4.0. Autor: mgr inż. Tomasz Staniszewski

Aplikacje geodezyjne

Wykład 4: Klasy i Metody

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Instalacja. Zawartość. Wyszukiwarka. Instalacja Konfiguracja Uruchomienie i praca z raportem Metody wyszukiwania...

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

Aplikacje w środowisku VBA. Visual Basic for Aplications

Programowanie obiektowe

Klasy i obiekty cz II

Kurs WWW. Paweł Rajba.

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Rozdział 4 KLASY, OBIEKTY, METODY

Scenariusz lekcji. Scenariusz lekcji 1 TEMAT LEKCJI: 2 CELE LEKCJI: 2.1 Wiadomości: 2.2 Umiejętności: 3 METODY NAUCZANIA: 4 ŚRODKI DYDAKTYCZNE:

Komunikacja w sieci Industrial Ethernet z wykorzystaniem Protokołu S7 oraz funkcji PUT/GET

Podstawy programowania skrót z wykładów:

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Laboratorium 1 - Programowanie proceduralne i obiektowe

Programowanie obiektowe. Obiekt Klasa Składnia klasy: Interfejsy Składnia interfejsu: Metody Składnia instrukcji Sub: Składnia instrukcji function:

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Stronicowanie na ¹danie

Projektowanie bazy danych

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

Praca na wielu bazach danych część 2. (Wersja 8.1)

Instalacja sterowników do urz¹dzeñ wielkoformatowych zainstalowanych w firmie Centrum Ksero STUDIO K2 s.c w Pile

Platformy Programistyczne Podstawy języka Java

Rys Mo liwe postacie funkcji w metodzie regula falsi

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

Platforma.NET laboratorium 4 Aktualizacja: 15/11/2013. Visual Basic.NET dostęp do bazy danych. Baza Microsoft SQL Server Compact

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Spis treści 1. Wstęp 2. Projektowanie systemów informatycznych

Wartości domyślne, szablony funkcji i klas

Rozdzia l 3. Laboratorium 3. danych zawierajac

System zarządzania bazą danych (SZBD) Proces przechodzenia od świata rzeczywistego do jego informacyjnej reprezentacji w komputerze nazywać będziemy

Programowanie obiektowe

Zaawansowane aplikacje internetowe - laboratorium

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Po³¹czenie iphone'a/ipad a do Smart Multishare USB

DJCONTROL INSTINCT I DJUCED PIERWSZE KROKI

Rozliczenia z NFZ. Ogólne założenia. Spis treści

STRUKTURA MENU STRUKTURA MENU

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

IV. UK ADY RÓWNAÑ LINIOWYCH

Prosta książka telefoniczna z wykorzystaniem zapisu do pliku

PHP 5 język obiektowy

Instrukcja laboratoryjna nr.4

Wstęp do programowania obiektowego. Wykład 2

Platforma.NET laboratorium 1. Visual Basic.NET podstawowe elementy języka. Wykonanie warunkowe If End If

Ten odcinek Akademii PC Kuriera poświęcony zostanie tworzeniu i wykorzystaniu funkcji i procedur w języku Visual Basic.NET.

Rozdział 3. Zapisywanie stanu aplikacji w ustawieniach lokalnych

Klasy abstrakcyjne i interfejsy

Programowanie obiektowe w VB cz 2

ECDL Advanced Moduł AM3 Przetwarzanie tekstu Syllabus, wersja 2.0

Wtedy wystarczy wybrać właściwego Taga z listy.

emszmal 3: Automatyczne księgowanie przelewów w menedżerze sprzedaży BaseLinker (plugin dostępny w wersji ecommerce)

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Programowanie RAD Delphi

Wykład 2 Składnia języka C# (cz. 1)

Biuro Podróży 0. Stwórz projekt aplikacja konsolowa lub WPF (przemyśl wybór, bo zmiana może być czasochłonna). 1. Stwórz abstrakcyjną klasę

AMPS Sterownik temperatur Instrukcja obs³ugi

INSTRUKCJA DO PROGRAMU LICZARKA 2000 v 2.56

Podstawy informatyki

emszmal 3: Automatyczne księgowanie przelewów w sklepie internetowym Magento (plugin dostępny w wersji ecommerce)

Informacje o omawianym programie. Założenia programu omawianego w przykładzie

Transkrypt:

Rozdzia³ 2 Tworzenie instancji klas z konstruktorami Rozdzia³ 2 Tworzenie instancji klas z konstruktorami W tym rozdziale: Tworzenie konstruktora klasy. Tworzenie wielu konstruktorów dla jednej klasy. Inicjowanie instancji klasy za pomoc¹ konstruktora. Implementowanie metody ToString dla klasy. Tworzenie tablicy instancji klasy. U ywanie tablicy instancji klasy jako Ÿród³a danych kontrolki ListBox. Szacunkowy czas 1 godz. 30 min. W poprzednim rozdziale tworzyliœmy klasê Book, która zawiera³a w³aœciwoœci Text i Title. Do utworzenia nowej instancji klasy wystarcz¹ trzy wiersze kodu: jeden z deklaracj¹ i utworzeniem instancji klasy, jeden w celu ustawienia w³aœciwoœci Text i jeden w celu ustawienia w³aœciwoœci Title. W tym rozdziale tworzymy konstruktor klasy, który bêdzie umo liwia³ jednoczesne wykonywanie wszystkich tych trzech kroków: deklarowanie, tworzenie instancji i inicjowanie pól. Konstruktory Konstruktor to blok kodu wykonywany w wyniku uruchomienia s³owa kluczowego new (New lub new w zale noœci od jêzyka) podczas tworzenia instancji klasy. Konstruktory maj¹ nastêpuj¹ce zalety: Konstruktor mo e przyjmowaæ parametry, które umo liwiaj¹ inicjowanie pól w chwili tworzenia obiektu. Konstruktor mo e sprawdzaæ poprawnoœæ przekazywanych do niego parametrów podczas tworzenia klasy. Klasa mo e mieæ wiele konstruktorów. Ka dy mo e przyjmowaæ inny zestaw parametrów. Jeden konstruktor mo e wywo³ywaæ inne konstruktory. Przy definiowaniu konstruktorów w jêzykach Visual Basic i Visual C# stosujemy nieco ró ne sk³adnie. W jêzyku Visual Basic konstruktor bezparametrowy deklarujemy tak: Public Sub New() End Sub W Visual C# ten sam konstruktor nale y zadeklarowaæ, u ywaj¹c nazwy klasy: public Book() {

28 Microsoft Visual Basic.NET i Microsoft Visual C#.NET w programowaniu obiektowym W obu przypadkach konstruktor deklaruje siê za pomoc¹ s³owa kluczowego public (Public lub public). Konstruktor jest niezbêdny do tworzenia instancji klasy za pomoc¹ s³owa kluczowego new. Konstruktor mo na tak e zadeklarowaæ za pomoc¹ s³owa kluczowego private (Private lub private). Jeœli zdefiniujesz tylko jeden konstruktor w klasie i bêdzie on prywatny, kod kliencki nie bêdzie w stanie tworzyæ adnych instancji klasy. Jeœli w danej klasie nie zostanie zdefiniowany aden konstruktor, kompilator sam wygeneruje pusty, publiczny i bezparametrowy konstruktor taki jak pokazany na powy szych listingach. W takiej sytuacji nale y w jakiœ inny sposób zagwarantowaæ polom klasy poprawne inicjowanie wartoœci (choæ jest to wbrew ca³ej filozofii konstruktorów). Inna implementacja klas ksi¹ ek W poprzednim rozdziale zaraz po zainicjowaniu klasy okreœlane by³y wartoœci w³aœciwoœci Text i Title. W tym rozdziale utworzysz dwa ró ne konstruktory do inicjowania pól klasy. Pierwszy, konstruktor domyœlny, bêdzie tworzy³ instancjê dok³adnie tak jak w rozdziale 1. Drugi konstruktor bêdzie inicjowa³ w³aœciwoœci Title i Text. Wprowadzimy jeszcze jedn¹ zmianê. Obiekty ksi¹ ek bêd¹ przechowywane w prostej tablicy, a nie w specjalnie utworzonym obiekcie Library. Tablica ta bêdzie stanowi³a Ÿród³o danych dla kontrolki ListBox. Tworzenie konstruktorów klasy Book To æwiczenie jest rozbudowaniem æwiczenia z rozdzia³u 1. Utworzymy nowy projekt, ale wykorzystamy w nim formularz i klasê Book utworzon¹ w rozdziale 1. Nastêpnie zmodyfikujemy klasê Book, dodaj¹c do niej dwa konstruktory i metodê ToString. Tworzenie projektu Aby utworzyæ ten projekt, wykonaj nastêpuj¹ce czynnoœci: 1. Utwórz nowy projekt aplikacji Windows i nadaj mu nazwê ReadMoreBooks. 2. Kliknij prawym przyciskiem myszy formularz Form1 w eksploratorze rozwi¹zañ i wybierz z menu podrêcznego polecenie Delete (usuñ). Kliknij przycisk OK, aby potwierdziæ zamiar usuniêcia. 3. Kliknij prawym przyciskiem myszy projekt ReadMoreBooks w eksploratorze rozwi¹zañ, wska Add (dodaj) i kliknij polecenie Add Existing Item (dodaj istniej¹cy element). 4. W oknie Add Existing Item przejdÿ do pliku Form1.vb lub pliku Form1.cs z rozdzia³u 1, kliknij go i naciœnij przycisk Open (otwórz). Do projektu ReadMoreBooks zostanie dodana nowa kopia formularza Form1. 5. Kliknij prawym przyciskiem myszy projekt ReadMoreBooks w eksploratorze rozwi¹zañ, wska Add (dodaj) i kliknij polecenie Add Existing Item (dodaj istniej¹cy element).

Rozdzia³ 2 Tworzenie instancji klas z konstruktorami 29 6. W oknie Add Existing Item przejdÿ do pliku Book z rozdzia³u 1, kliknij go, a potem naciœnij przycisk Open (otwórz). Do projektu ReadMoreBooks zostanie dodana klasa Book. Konwersja tekstu z pola na w³aœciwoœæ Dziêki utworzeniu konstruktora bêdziemy mogli okreœlaæ, czy pole Text lub Title klasy Book jest puste. Aby dodatkowo rozszerzyæ przydatnoœæ tekstu, przekszta³cimy go na w³aœciwoœæ (w dalszej czêœci tej ksi¹ ki nie bêdzie wiele pól publicznych). 1. Kliknij dwukrotnie plik Book.vb lub Book.cs (w zale noœci od u ywanego jêzyka) w eksploratorze rozwi¹zañ, aby otworzyæ go w edytorze kodu. 2. Zmieñ pole Text na prywatne. Pamiêtaj, e zgodnie z konwencj¹ pola takie maj¹ prefiks m_. Private m_text As String = "" private string m_text = ""; 3. Dodaj definicjê w³aœciwoœci Text do klasy. Public Property Text()As String Get Return m_text End Get Set(ByVal Value As String) m_text = Value End Set End Property //Visual C# public string Text { get { return m_text; set { m_text = value; Formatowanie kodu C# W jêzyku C# do oddzielania instrukcji stosuje siê œrednik. Dziêki temu Visual C# oferuje wiêksz¹ kontrolê nad formatowaniem kodu ni Visual Basic. W cytowanym wy ej fragmencie kodu C# zastosowano bardziej zwart¹ postaæ definicji. Mo - na i warto to robiæ, o ile nie odbywa siê to kosztem czytelnoœci kodu. Dodawanie konstruktora bezparametrowego 1. Jeœli u ywasz Visual C#, w plikach Book.cs i Form1.cs zmieñ przestrzeñ nazw na ReadMoreBooks. Ten krok spowoduje, e wszystkie deklaracje klas znajd¹ siê w jednej przestrzeni nazw projektu. Dziêki temu deklarowanie zmiennych klasowych bêdzie prostsze. Zmieñ deklaracjê przestrzeni nazw na pocz¹tku pliku na nastêpuj¹c¹:

30 Microsoft Visual Basic.NET i Microsoft Visual C#.NET w programowaniu obiektowym // Tylko Visual C# // Zmieñ w plikach Book.cs i Form1.cs namespace ReadMoreBooks 2. W Visual Basicu, jeœli trzeba, kliknij pozycjê Book (ReadMoreBooks) na liœcie Class Name (nazwa klasy). W Visual C# kliknij pozycjê ReadMoreBooks.Book na liœcie Class Name (nazwa klasy). 3. Z listy rozwijanej Method Name (nazwa metody) wybierz pozycjê New (nowa), jeœli u ywasz Visual Basica. Kliknij pozycjê Book, jeœli u ywasz Visual C#. Do klasy Book zostanie dodany nastêpuj¹cy kod: Public Sub New() End Sub public Book() { // // Do zrobienia: Dodaæ treœæ konstruktora // Twoim nastêpnym zadaniem bêdzie utworzenie konstruktora z parametrami. Jedna klasa mo e mieæ wiele konstruktorów, o ile ró ni¹ siê one list¹ parametrów. Tworzenie konstruktora parametrycznego Podczas tworzenia konstruktorów z parametrami pamiêtaj, e kod konstruktora jest wykonywany zawsze po inicjacjach pól. Mo na zatem przes³aniaæ inicjacje pól, czyli wpisywaæ do pól wartoœci inne ni inicjacyjne. 1. Po deklaracjach pól dodaj poni szy kod, który zawiera deklaracjê konstruktora z dwoma parametrami: title i text. Nie modyfikuj istniej¹cego konstruktora, który utworzy³eœ w poprzednim podrozdziale. Public Sub New(ByVal title As String,ByVal text As String) End Sub //Visual C# public Book(string title, string text){ 2. Dodaj poni szy kod do nowego konstruktora. Dziêki temu tytu³ ani tekst ksi¹ ki nie bêdzie pusty. Jeœli jest pusty, generowany jest wyj¹tek. Wyj¹tek zatrzymuje dzia³anie programu i uniemo liwia utworzenie instancji klasy. If (title <> "") And (text <> "") And _ (Not IsNothing(title)) And (Not IsNothing(text)) Then m_title = title m_text = text Else Throw New Exception("Title or text is an empty string.") End If if ((title!= "") && (text!= "") && (title!= null) && (text!= null)) {

Rozdzia³ 2 Tworzenie instancji klas z konstruktorami 31 m_title = title; m_text = text; else { throw new System.Exception("Title or text is an empty string."); Jeœli usuniesz konstruktor bezparametrowy utworzony w poprzednim podrozdziale, kod kliencki zostanie zmuszony do korzystania z tego nowego konstruktora. Oznacza to, e nie zostan¹ utworzone adne instancje klasy, jeœli nie bêdzie znany tekst i tytu³ ksi¹ ki. Dodawanie metody ToString W rozdziale 1 u ywaliœmy ³añcucha znaków z pola Title podczas wyœwietlania pola listy w projekcie ReadBooks. W tym rozdziale instancje klasy Book bêd¹ przechowywane w tablicy, mo emy wiêc skorzystaæ z faktu, i Ÿród³em danych dla pola listy mo e byæ tablica. Jeœli zdefiniujemy metodê ToString dla klasy obiektów przeznaczonych do wyœwietlania, pole listy bêdzie mog³o za jej pomoc¹ wyœwietlaæ poszczególne elementy z tablicy. Dodaj tê metodê do klasy Book: Public Overrides Function ToString() As String Return m_title End Function public override string ToString() { return m_title; W przypadku biblioteki.net Framework nie mo na w³aœciwie nie zauwa yæ faktu, e wszystkie klasy s¹ pochodnymi klasy System.Object. S³owo kluczowe override (w Visual Basicu Overrides, a w Visual C# override) w deklaracji metody oznacza, e zamiast metody ToString zdefiniowanej w klasie System.Object powinna byæ u ywana metoda ToString z klasy Book. Metoda zdefiniowana w przestrzeni nazw System.Object powoduje tylko wypisanie nazwy klasy ReadMoreBooks.Book. To ju koniec zmian w definicji klasy Book. Obs³uga b³êdów sprawdzania poprawnoœci za pomoc¹ konstruktora Z sytuacj¹, w której parametr title lub text oka e siê ³añcuchem pustym, mo na poradziæ sobie na ró ne sposoby: Mo na wygenerowaæ wyj¹tek, jak w tym rozdziale. W takim przypadku nie dochodzi to utworzenia instancji klasy Book. Wykonywanie programu jest zatrzymywane na wierszu kodu zawieraj¹cym s³owo kluczowe new. Na sytuacjê tak¹ mo na zareagowaæ za pomoc¹ bloku Try (Try lub try), w którym da siê naprawiæ b³¹d.

32 Microsoft Visual Basic.NET i Microsoft Visual C#.NET w programowaniu obiektowym Mo na zast¹piæ pole ³añcuchem pustym. Jeœli napisa³eœ konstruktor wymuszaj¹cy stosowanie niepustych ³añcuchów w polach text i title, nie powinieneœ stosowaæ tej metody. Jeœli u y³eœ konstruktora jako wygodnego sposobu przypisywania wartoœci do w³aœciwoœci na etapie inicjacji klasy, zast¹pienie pola ³añcuchem pustym mo e byæ decyzj¹ rozs¹dn¹. Jeœli postanowisz zastêpowaæ pole ³añcuchem pustym, nie zapomnij uœwiadomiæ programistom, e pola text i title instancji klasy Book mog¹ zawieraæ ³añcuchy puste. U ywanie konstruktorów Teraz zast¹pisz wiele wierszy kodu jednym wywo³aniem konstruktora. Zast¹pisz tak e klasê Library tablic¹ i wykorzystasz mo liwoœæ wi¹zania danych biblioteki.net Framework, stosuj¹c tablicê jako Ÿród³o danych dla pola listy. Usuwanie kodu, który zostanie zast¹piony nowym 1. Kliknij prawym przyciskiem myszy pozycjê Form1 w eksploratorze rozwi¹zañ i wybierz z menu podrêcznego polecenie View Code (poka kod), aby otworzyæ edytor kodu. 2. Usuñ metodê showpage_click. 3. Usuñ deklaracjê pola Library z klasy Form1. Pole to zast¹pisz tablic¹ instancji klasy Book. ' Usuñ ten wiersz z projektu Visual Basica Private m_library As Library // Usuñ ten wiersz z projektu Visual C# private Library m_library; 4. Usuñ kod z procedury zdarzeñ Form1_Load. 5. Usuñ kod z metody listofbooks_selectedindexchanged. Zostanie ci tylko interfejs. Teraz dodasz kod, który odtworzy zachowanie programu znane z rozdzia³u 1. Tworzenie instancji klasy Book przy u yciu konstruktora Dodasz do metody Form1_Load kod tworz¹cy tablicê z instancjami klasy Book i wi¹ ¹cy j¹ z kontrolk¹ ListBox. 1. Utwórz instancjê klasy Book przeznaczon¹ na baœnie, u ywaj¹c konstruktora z dwoma parametrami. Dodaj nastêpuj¹cy kod do metody Form1_Load: Dim fairytales As Book = _ New Book("Fairy Tales", "Once upon a time there was a bear.") Book fairytales = new Book("Fairy Tales", "Once upon a time there was a bear.");

Rozdzia³ 2 Tworzenie instancji klas z konstruktorami 33 Zwróæ uwagê na to, e kiedy wpiszesz s³owo new lub New, w zale noœci od u ywanego jêzyka, funkcje inteligencji Visual Studio (zwane IntelliSense) wska ¹ ci, e masz zdefiniowane dwa konstruktory, jak widaæ na za³¹czonym rysunku. Gdy do dyspozycji jest wiele konstruktorów, mówimy, e s¹ one przeci¹ one. 2. Utwórz instancjê klasy Book przeznaczon¹ na przepisy kucharskie, korzystaj¹c z konstruktora z dwoma parametrami: Dim cookies As Book = New Book("Cookies", _ "Chocolate chip cookies are the most delicious cookies.") Book cookies = new Book("Cookies", "Chocolate chip cookies are the most delicious cookies."); Tworzenie tablicy instancji klasy Book 1. Po deklaracjach klasy Book dodaj nastêpuj¹cy kod, tworz¹cy tablicê: Dim m_library() As Book = New Book() {fairytales, cookies Book[] m_library = new Book[] {fairytales, cookies; 2. Po deklaracji tablicy dodaj nastêpuj¹cy kod, który sprawi, e tablica zostanie wykorzystana jako Ÿród³o danych kontrolki ListBox: listofbooks.datasource = m_library listofbooks.datasource = m_library; Oto kompletny kod metody: Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Dim fairytales As Book = _ New Book("Fairy Tales", "Once upon a time there was a bear.") Dim cookies As Book = New Book("Cookies", _ "Chocolate chip cookies are the most delicious cookies.") Dim m_library() As Book = New Book() {fairytales, cookies listofbooks.datasource = m_library End Sub private void Form1_Load(object sender, System.EventArgs e) { Book fairytales = new

34 Microsoft Visual Basic.NET i Microsoft Visual C#.NET w programowaniu obiektowym Book("Fairy Tales", "Once upon a time there was a bear."); Book cookies = new Book("Cookies", "Chocolate chip cookies are the most delicious cookies."); Book[] m_library = new Book[] {fairytales, cookies; listofbooks.datasource = m_library; Reagowanie na wybranie elementu z listy reprezentowanej kontrolk¹ ListBox Po uruchomieniu aplikacji w kontrolce ListBox pojawi¹ siê tytu³y ksi¹ ek. Poniewa Ÿród³em danych kontrolki ListBox jest tablica instancji klasy Book, ka dy element z listy reprezentuje jedn¹ instancjê klasy Book. Teraz dodasz kod, który bêdzie pobiera³ dan¹ instancjê i wyœwietla³ wybran¹ stronê. 1. Do obs³ugi zdarzenia SelectedIndexChanged kontrolki ListBox o nazwie listofbooks dodaj nastêpuj¹cy kod: Dim thebook As Book = CType(listOfBooks.SelectedItem, Book) Book thebook = (Book)(listOfBooks.SelectedItem); Jak widzia³eœ w rozdziale 1, obiekty z kontrolki ListBox s¹ traktowane jak instancje obiektu System.Object. Metoda CType nie zmienia instancji, a jedynie jej widok w czasie wykonywania kodu. Sk³adnia C# jest trochê inna, ale ma taki sam efekt. Egzemplarz ksi¹ ki bêdzie traktowany nie jak instancja klasy System.Object, ale jak instancja klasy Book. 2. Pod instrukcj¹ CType dodaj nastêpuj¹cy kod, wyœwietlaj¹cy tekst jednej strony: titlelabel.text = thebook.title thebook.pagelength = Decimal.ToInt32(pageLength.Value) page.text = thebook.getpage(decimal.toint32(pagetodisplay.value)) titlelabel.text = thebook.title; thebook.pagelength = Decimal.ToInt32(pageLength.Value); page.text = thebook.getpage(decimal.toint32(pagetodisplay.value)); Poniewa pagelength.value jest w³aœciwoœci¹ stringow¹ kontrolki pagelength, nie mo na bezpoœrednio przypisaæ jej wartoœci do w³aœciwoœci ca³kowitoliczbowej thebook.pagelength. Dlatego potrzebna jest metoda Decimal.ToInt32, która przekszta³ci string pagelength.value na liczbê ca³kowit¹. 3. Uruchom i przetestuj program. Powinien dzia³aæ tak samo jak aplikacja z rozdzia³u 1. Te dwa æwiczenia demonstruj¹ pewne opcje dostêpne przy projektowaniu obiektów i aplikacji. W rozdziale 1 zaprojektowa³eœ klasy Book i Library, które mia³y stanowiæ model do rozwi¹zywanego zadania. W tym rozdziale zaprojektowa³eœ tylko klasê Book, a potem zaimplementowa³eœ funkcjonalnoœæ klasy Library, wykorzystuj¹c mo li-

Rozdzia³ 2 Tworzenie instancji klas z konstruktorami 35 woœci kontrolek systemu Windows dla platformy.net. Funkcjonalnoœæ klasy Library zapewni³a kontrolka ListBox wspó³pracuj¹ca z tablic¹. Deklarowanie i inicjowanie tablic Tablice instancji klas mo na deklarowaæ i inicjowaæ na wiele sposobów. Oto sk³adnia zastosowana w poprzednim podrozdziale (Visual Basic): Dim m_library() As Book = New Book() {fairytales, cookies A to inny sposób zadeklarowania tej samej tablicy: Dim books() As Book = _ {New Book("Title1", "Text1"), New Book("Title2", "Text2") Jeszcze inny: Dim m_library() As Book = {fairytales, cookies I jeszcze inny: Dim books(2) As Book books(0) = New Book("Title1", "Text1") books(1) = New Book("Title2", "Text2") books(2) = New Book("Title3", "Text3") Typy referencyjne i wartoœciowe Aby zrozumieæ, o co chodzi w ostatnich trzech fragmentach kodu, musisz poznaæ pojêcie typu referencyjnego i typu wartoœciowego w jêzykach Visual Basic i Visual C#. Ka da zmienna deklarowana w tej ksi¹ ce bêdzie jednego b¹dÿ drugiego typu. Typy danych w Visual Basicu i C# W jêzyku Visual Basic ka da zmienna jest typu referencyjnego lub wartoœciowego. W jêzyku C# wystêpuje jeszcze trzecia kategoria: typy wskaÿnikowe. Zmiennej typu wskaÿnikowego, podobnej do wskaÿnika z C++, mo na u yæ tylko w niezabezpieczonym bloku kodu. W tej ksi¹ ce nie zajmujemy siê kodem niezabezpieczonym. Zmienn¹ typu referencyjnego tworzymy za ka dym razem, gdy deklarujemy j¹ jako: klasê (na przyk³ad Book), interfejs (interfejsy s¹ omawiane w rozdziale 9), tablicê (na przyk³ad Dim numbers() as Integer), string, obiekt (na przyk³ad Dim x As Object), delegacjê (delegacje zostan¹ omówione w rozdziale 7). Typ wartoœciowy powstaje w wyniku zadeklarowania zmiennej jako typu: ca³kowitoliczbowego (na przyk³ad Integer lub int),

36 Microsoft Visual Basic.NET i Microsoft Visual C#.NET w programowaniu obiektowym zmiennopozycyjnego (na przyk³ad Double lub double), logicznego (na przyk³ad Boolean lub bool), wyliczeniowego (na przyk³ad System), strukturowego (na przyk³ad DateTime). Zarówno w przypadku deklarowania zmiennej typu wartoœciowego, jak i przy deklarowaniu zmiennej typu referencyjnego dla zmiennej rezerwowane jest pewne miejsce w pamiêci. Jednak w przypadku typu wartoœciowego w miejscu tym przechowywana jest wartoœæ zmiennej, a w przypadku zmiennej typu referencyjnego referencja do wartoœci (instancji klasy znajduj¹cej siê gdzieœ w pamiêci). Zatem deklaracje referencyjne powoduj¹ zarezerwowanie tylko takiej iloœci pamiêci, która wystarczy na odwo³anie siê do instancji klasy Book. Dim abook as Book; Book abook; Gdy instancja klasy tworzona jest za pomoc¹ operatora new (w Visual Basicu New, a w Visual C# new), rezerwowana jest pamiêæ na pola zadeklarowane w klasie. Poni - sze wyra enia powoduj¹ zarezerwowanie pamiêci na pola Text, PageLength i Title klasy Book. Operator new zwraca adres miejsc w pamiêci zawieraj¹cych wartoœci pól. New Book("theTitle", "thetext") new Book("theTitle", "thetext") Poni sze instrukcje tworz¹ instancjê klasy Book i przypisuj¹ zmiennej abook miejsce nowej instancji. abook = New Book("theTitle", "thetext") abook = new Book("theTitle", "thetext") Jaka jest zatem wartoœæ zmiennej abook w pierwszym zestawie instrukcji, zanim nast¹pi powy sze przypisanie? Z definicji wartoœci¹ typu referencyjnego przed inicjacj¹ jest Nothing w Visual Basicu oraz null w C#. Poni szy kod zwraca wartoœæ True: Dim abook as Book MessageBox.Show((aBook Is Nothing).ToString()) Book abook; MessageBox.Show((aBook == null).tostring()); Visual Basic do testowania wartoœci typów referencyjnych oferuje s³owo kluczowe Is.C# pozwala na stosowanie operatora porównania ==. Visual Basic udostêpnia te metodê IsNothing do testowania wartoœci referencji. Zwraca ona wartoœæ logiczn¹ True, jeœli referencja jest równa Nothing. Poni szy fragment kodu jest odpowiednikiem poprzedniego: Dim abook As Book MessageBox.Show(IsNothing(aBook).ToString()) Jeœli spróbujesz u ywaæ w³aœciwoœci lub metod referencji równej Nothing, zostanie wygenerowany b³¹d, a to dlatego, e nie ma jeszcze danych instancji, na których mo -

Rozdzia³ 2 Tworzenie instancji klas z konstruktorami 37 na by operowaæ. B³¹d ten jest znany jako wyj¹tek System.NullReferenceException. Aby program sta³ siê bardziej odporny, nale y sprawdzaæ, czy dana referencja nie jest równa null (w przypadku Visual Basica Nothing). Sprawdzenie takie nale y stosowaæ szczególnie w przypadku przekazywania metody jako parametru. Mamy bowiem wtedy mniejsz¹ kontrolê nad stanem zmiennej. Specyfika typów referencyjnych dotyka takich zagadnieñ, jak kopiowanie, sprawdzanie równoœci i zbieranie œmieci (odzyskiwanie pamiêci). Kopiowanie omawiane jest w rozdziale 10, sprawdzanie równoœci w rozdziale 12, a zbieranie œmieci w rozdziale 8. Deklaracje tablic W pierwszych trzech przyk³adach z podrozdzia³u Deklarowanie i inicjowanie tablic u yto ró nych odmian nastêpuj¹cej sk³adni: Dim m_library() As Book = {fairytales, cookies W tym przyk³adzie tablicê elementów otrzymujemy dziêki nawiasom klamrowym. Identyfikator fairytales mo na zast¹piæ wyra eniem New Book("Fairy Tales", "Once upon a time"), poniewa wyra enie to zwraca referencjê do instancji klasy. Ten przyk³ad jest nieco inny od pozosta³ych: Dim books(2) As Book books(0) = New Book("Title1", "Text1") books(1) = New Book("Title2", "Text2") books(2) = New Book("Title3", "Text3") Pierwsza instrukcja nie tworzy adnych instancji klasy Book. Tworzy jedynie tablicê instancji klasy Book. W wierszach od drugiego do czwartego instancje klasy Book s¹ tworzone i przypisywane do referencji. Krótkie podsumowanie Zadanie tworzenie konstruktora bez parametrów tworzenie konstruktora parametrycznego Sposób wykonania Wybierz w edytorze kodu nazwê klasy z listy Class Name (nazwa klasy) i wybierz New (w przypadku Visual Basica) lub nazwê klasy z listy (w Visual C#) z listy rozwijanej Method Name (nazwa metody). Albo Dodaj ten kod (Visual Basic): Public Sub New() End Sub Lub ten kod (Visual C#): public Book() { Utwórz konstruktor bez parametrów. Dodaj parametry tak samo jak w przypadku metody dowolnej klasy.

38 Microsoft Visual Basic.NET i Microsoft Visual C#.NET w programowaniu obiektowym Zadanie tworzenie tablicy instancji referencji tworzenie tablicy instancji sprawdzanie, czy referencja jest równa Nothing b¹dÿ null Sposób wykonania Dodaj nastêpuj¹cy kod (Visual Basic): Dim books() As Book lub kod (Visual C#): Book[] books; Dodaj nastêpuj¹cy kod (Visual Basic): Dim books() As Book = _ { New Book(), New Book() lub kod (Visual C#): Book[] books = { new Book(), new Book(); Dodaj nastêpuj¹cy kod (Visual Basic): Dim abook As Book If IsNothing(aBook) Then ' Miejsce na kod dla ' referencji pustej End If lub kod (Visual C#): Book abook; if (abook == null) { // Miejsce na kod dla // referencji pustej