Konstruktor :new()
Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 8 z 70.
Ręczne tworzenie obiektów, tworzenie pustej tablicy, ustawianie jej metatabeli i łączenie z __index staje się powtarzalne. Standardowym rozwiązaniem jest zdefiniowanie metody konstruktora :new() bezpośrednio w klasie, która zajmie się tym wszystkim za Ciebie.
Oto wzorzec:
local Dog = {}
Dog.__index = Dog
function Dog:new()
local instance = {}
setmetatable(instance, self)
return instance
end
function Dog:bark()
print("Woof!")
endPrzyjrzyjmy się temu, co dzieje się wewnątrz :new(). Najpierw tworzymy pustą tablicę o nazwie instance. Następnie ustawiamy jej metatabelę na self, którym jest Dog, gdy wywołujemy Dog:new().
Ponieważ Dog.__index wskazuje na samo Dog, instancja może znaleźć wszystkie metody zdefiniowane w Dog. Na koniec zwracamy nowy obiekt.
Zwróć uwagę na linię Dog.__index = Dog poza konstruktorem. To popularny skrót: zamiast tworzyć osobną metatabelę, tabela klasy służy zarówno jako prototyp, jak i metatabela.
Teraz tworzenie obiektów jest przejrzyste i spójne:
local myDog = Dog:new()
myDog:bark() -- Wynik: Woof!Każda utworzona przez Ciebie klasa będzie miała tę samą strukturę. Konstruktor :new() staje się jedynym miejscem, w którym odbywa się tworzenie obiektów, dzięki czemu Twój kod jest uporządkowany i przewidywalny.
Wyzwanie
ŁatwyZbudujmy klasę Cat, używając standardowego wzorca konstruktora, którego właśnie się nauczyłeś. Podzielisz kod na dwa pliki, aby przećwiczyć prawidłową strukturę modułów.
Utworzysz:
Cat.lua: Zdefiniuj klasęCatz pełnym wzorcem konstruktora. Twoja klasa powinna zawierać:- Tabelę klasy z polem
__indexwskazującym na nią samą - Konstruktor
:new(), który tworzy instancję, ustawia jej metatabelę i ją zwraca - Metodę
:meow(), która wypisuje dźwięk wydawany przez kota
- Tabelę klasy z polem
main.lua: Załaduj moduł Cat i użyj konstruktora, aby utworzyć instancję kota. Następnie wywołaj jego metodę, aby sprawdzić, czy wszystko jest prawidłowo połączone.
Otrzymasz jedno wejście: liczbę razy, ile kot powinien miauknąć.
Twoja metoda :meow() powinna wypisać dokładnie:
Meow!W głównym pliku utwórz kota za pomocą Cat:new() i wywołaj :meow() określoną liczbę razy.
Na przykład, jeśli wejściem jest 3, wynikiem powinno być:
Meow!
Meow!
Meow!Spróbuj swoich sił
-- Załaduj moduł Cat
local Cat = require('Cat')
-- Odczytaj dane wejściowe: liczbę miauknięć
local times = tonumber(io.read())
-- TODO: Utwórz instancję kota za pomocą Cat:new()
-- TODO: Wywołaj metodę :meow() określoną liczbę razy
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Koncepcja „self”
Tabele z funkcjamiJawne „self”Składnia z dwukropkiemKropka czy dwukropekPodsumowanie — poruszający się punkt4Projekt: Bank cyfrowy
Konfiguracja projektuMetoda wpłaty7Polimorfizm i nadpisywanie
Nadpisywanie metodWywoływanie metod klasy nadrzędnejTypowanie kaczeWspólny interfejsSprawdzanie typuPodsumowanie — role pracowników10Projekt: Menedżer kształtów
Konfiguracja projektuKlasa prostokątaKlasa kołaMetoda obwoduKolekcja kształtówPole całkowiteFiltrowanie kształtów2Wzorzec prototypu klasy
Koncepcja prototypuŁączenie za pomocą __indexKonstruktor :new()Inicjalizacja atrybutówNiezależne instancjePodsumowanie – fabryka samochodów5Przeciążanie operatorów w OOP
Dodawanie obiektówOdejmowanie obiektówŁączenie obiektówPorównywanie obiektów (<, >)Powtórka — działania na portfelu8Hermetyzacja
Konwencje nazewnictwaDomknięcia dla prywatnościDostęp za pomocą domknięćTabele tylko do odczytuLogika walidacjiPodsumowanie — bezpieczny sejf11Wzorce projektowe (podstawy)
Funkcje fabrykująceTabela SingletonWzorzec iteratoraObserwator (nasłuchujący)Powtórka — fabryka loggera3Stan i zachowanie obiektu
Zmienne instancjiMetody dostępoweMetody ustawiająceWłaściwości obliczaneFormatowanie ciągów znakówSprawdzanie równościPodsumowanie – ocena ucznia6Podstawy dziedziczenia
Konfiguracja dziedziczeniaDziedziczenie metodRozszerzanie konstruktoraDodawanie metod potomnychWspólne i unikalne elementyPowtórka — hierarchia kształtówPoćwicz samodzielnie: Kompilator Lua online