Menu
Coddy logo textTech

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!")
end

Przyjrzyjmy 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.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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ę Cat z pełnym wzorcem konstruktora. Twoja klasa powinna zawierać:
    • Tabelę klasy z polem __index wskazują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
    Zwróć tabelę klasy na końcu pliku.
  • 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
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Lua online