Menu
Coddy logo textTech

Inicjalizacja atrybutów

Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 9 z 70.

Konstruktor :new(), którego się nauczyłeś, tworzy obiekty, ale każda instancja jest na początku identyczna. Prawdziwe obiekty potrzebują unikalnych danych: osoba ma konkretne imię, a gracz — wynik początkowy. Aby obiekty były użyteczne, konstruktor musi przyjmować argumenty i przypisywać je do nowej instancji.

Oto jak rozszerzyć konstruktor, aby przyjmował wartości początkowe:

local Dog = {}
Dog.__index = Dog

function Dog:new(name, breed)
    local instance = {}
    setmetatable(instance, self)
    instance.name = name
    instance.breed = breed
    return instance
end

function Dog:introduce()
    print("I am " .. self.name .. ", a " .. self.breed)
end

Konstruktor przyjmuje teraz parametry name i breed. Po utworzeniu pustej instancji i ustawieniu jej metatabeli przypisujemy te wartości bezpośrednio do pól instancji. Każdy utworzony obiekt będzie miał własne pola name i breed.

local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")

dog1:introduce()  -- Wynik: Jestem Rex, owczarkiem niemieckim
dog2:introduce()  -- Wynik: Jestem Bella, pudlem

Oba psy korzystają z tej samej metody :introduce() z prototypu, ale każdy z nich ma własne, unikalne imię i rasę zapisane w swojej tabeli instancji. Na tym polega siła połączenia prototypów z konstruktorami przyjmującymi parametry: wspólne zachowanie i indywidualny stan.

challenge icon

Wyzwanie

Łatwy

Zbudujmy klasę Person, która tworzy unikalne osoby z własnymi imionami i wiekiem. Rozmieścisz kod w dwóch plikach, aby przećwiczyć prawidłową strukturę modułów.

Utworzysz:

  • Person.lua: Zdefiniuj klasę Person z konstruktorem, który przyjmuje imię i wiek. Dodaj metodę :introduce(), dzięki której każda osoba może się przedstawić.
  • main.lua: Załaduj moduł Person i utwórz instancję osoby, używając podanych danych wejściowych. Następnie wywołaj jej metodę przedstawiania się.

Konstruktor :new(name, age) powinien przyjmować obie wartości i zapisywać je w nowej instancji. Metoda :introduce() powinna wypisać tekst w dokładnie takim formacie:

Hello, my name is [name] and I am [age] years old

Otrzymasz dwa dane wejściowe:

  1. Imię osoby
  2. Wiek osoby

Na przykład, jeśli danymi wejściowymi są Alice i 25, wynik powinien wyglądać tak:

Hello, my name is Alice and I am 25 years old

Spróbuj swoich sił

-- Załaduj moduł Person
local Person = require('Person')

-- Odczytaj dane wejściowe
local name = io.read()
local age = io.read()

-- TODO: Utwórz nową instancję Person za pomocą Person:new(name, age)

-- TODO: Wywołaj metodę introduce() na swojej instancji Person
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