Cele lekcji
Po zakończeniu tej lekcji…
- Poznasz konstruktora klas.
- Dowiesz się, jak używać konstruktora klas w celu ustawiania właściwości obiektu podczas tworzenia jego wystąpień.
- Zrozumiesz, w jaki sposób klasa podrzędna (pochodna) może wywoływać konstruktora swojej klasy podstawowej.
Czas wyczyścić kod
W klasie SuperAdventure tworzone jest wystąpienie obiektu Player, a kolejnych 5 wierszy ustawia właściwości obiektu Player. Działa to nieźle, ale kod jest trochę niechlujny. Możemy go wyczyścić i skomasować te operacje w jednym wierszu.
W tym celu posłużymy się nową klasą konstruktora.
Każda klasa rozpoczyna się od konstruktora domyślnego. To właśnie konstruktor jest uruchamiany po wywołaniu new Player(). Wykonuje on kompilację i zwraca obiekt Player.
Możemy jednak utworzyć własnego konstruktora, który poza działaniem domyślnym wykona inne operacje. Podczas tej lekcji utworzymy konstruktora przyjmującego wartości, które my chcemy zachować we właściwościach.
Etap 1: Uruchom aplikację Visual Studio i otwórz swoje rozwiązanie.
Etap 2: Aby sprawdzić, jak to działa, w kodzie interfejsu użytkownika tymczasowo utwórz obiekt location (lokalizacja). W projekcie SuperAdventure prawym przyciskiem myszy kliknij pozycję SuperAdventure.cs i wybierz polecenie View Code.
Etap 3: Przejdź do końca wiersza 21 i naciśnij dwukrotnie klawisz Enter, a następnie dodaj poniższy kod:
Location location = new Location(); location.ID = 1; location.Name = "Home"; location.Description = "This is your house.";
Tworzymy właśnie nowy obiekt Location. Zapiszemy go w zmiennej location (nazwa zmiennej jest w całości zapisana małymi literami, aby odróżnić ją od klasy). Za chwilę przypiszemy wartości do właściwości tego obiektu.
Etap 4: W projekcie Engine dwukrotnie kliknij klasę Location, aby wyświetlić jej kod. Przejdź do końca wiersza 13. i naciśnij dwukrotnie klawisz Enter. Następnie dodaj poniższy kod:
public Location(int id, string name, string description) { ID = id; Name = name; Description = description; }
To właśnie nasz nowy kod konstruktora.
Rozpoczyna się on modyfikatorem public, ponieważ chcemy móc tworzyć nowy obiekt Location z dowolnego położenia w rozwiązaniu. Następnie występuje nazwa klasy i trzy parametry w nawiasach.
Po uruchomieniu funkcji lub metody (np. konstruktor) może ona przyjmować wartości nazywane parametrami. W języku C# należy zadeklarować typ danych parametru i jego nazwę. Nasz konstruktor zawiera trzy parametry: id (liczba całkowita), name (ciąg) i description (inny ciąg).
Nazwy parametrów odpowiadają nazwom właściwości, ale są zapisane w całości małymi literami. Różne wielkości liter pozwalają rozróżniać, czy mamy do czynienia z właściwością czy wartością parametru. Nazwa parametru nie musi być zgodna z nazwą właściwości, ale ja stosuje zgodne nazwy, aby jednoznacznie wskazać, do czego odnoszą się dane parametry.
Więc podczas wywoływania konstruktora Location należy przekazać te trzy wartości.
W wierszach 17-19 przypiszemy wartości parametrów do właściwości w klasie. Wszystkie parametry (małe litery) znajdują się po prawej stronie znaku równości, a właściwości (różna wielkość liter) — po lewej. Wartość po prawej stronie znaku równości jest przypisywana do właściwości lub zmiennej po lewej stronie.
Etap 5: Po przejściu do kodu SuperAdventure fragment new Location() jest podkreślony na czerwono. Dlaczego? Ponieważ w klasie Location nie używamy już konstruktora domyślnego i używamy własnego, niestandardowego konstruktora wymagającego trzech parametrów.
Po usunięciu sekcji new Location() i ponownym jej wprowadzeniu podczas wpisywania otwartego nawiasu pojawia się podpowiedź z „sygnaturą metody”, czyli parametrami, które należy przekazać do metody/konstruktora.
Wiersz 23 zmodyfikuj, aby wyglądał tak:
Location location = new Location(1, "Home", "This is your house.");
Teraz po utworzeniu nowego obiektu Location możesz przekazać parametry, które chcesz przypisać do właściwości. Dzięki temu kod staje się bardziej przejrzysty, a ponadto pozwala to upewnić się, że określone zostały wszystkie właściwości, gdyż podczas ręcznego ustawiania wszystkich właściwości łatwo o jakiejś z nich zapomnieć. Konstruktor akceptujący parametry nie pozwoli pominąć żadnej z nich i zawsze będziesz wiedzieć, ile właściwości należy przekazać. Jeśli jednak zapomnisz o którejś z nich, to zostanie wyświetlone czerwone podkreślenie.
Etap 6: W projekcie Engine kliknij dwukrotnie klasę Quest i zacznij ją modyfikować. Po właściwościach dodaj następujące wiersze:
public Quest(int id, string name, string description, int rewardExperiencePoints, int rewardGold) { ID = id; Name = name; Description = description; RewardExperiencePoints = rewardExperiencePoints; RewardGold = rewardGold; }
Klasa Quest ma już niestandardowego konstruktora przyjmującego wartości pozwalające na określenie jego właściwości.
Podsumowanie
Niestandardowe konstruktory są powszechnie używane w projektach w języku C# i pozwalają w porosty sposób upewnić się, że w danej klasie określono wszystkie wymagane właściwości. Za pomocą konstruktora można również wykonać operacje specjalne, ale o tym opowiem później.
Łącza do tej lekcji