Dodawanie obiektów
Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 26 z 70.
Widziałeś już, jak metody metatablicy, takie jak __tostring i __eq, pozwalają dostosowywać zachowanie obiektów. Teraz rozszerzymy to na operacje arytmetyczne, zaczynając od dodawania.
Metametoda __add określa, co się dzieje, gdy używasz operatora + między dwoma obiektami. Gdy Lua napotka a + b, szuka __add w metatabeli jednego z operandów.
local Vector = {}
Vector.__index = Vector
function Vector:new(x, y)
local obj = {x = x, y = y}
setmetatable(obj, Vector)
return obj
end
function Vector.__add(v1, v2)
return Vector:new(v1.x + v2.x, v1.y + v2.y)
endZauważ, że __add jest zdefiniowane z kropką, a nie dwukropkiem. Otrzymuje oba operandy jako argumenty i powinno zwracać nowy obiekt, zamiast modyfikować którykolwiek z oryginalnych. Dzięki temu operacja jest przewidywalna i bezpieczna.
local a = Vector:new(3, 4)
local b = Vector:new(1, 2)
local c = a + b
print(c.x, c.y) -- Wynik: 4 6Kluczowe spostrzeżenie jest takie, że __add musi znajdować się w samej metatabeli (tutaj Vector), a nie tylko w obiekcie. Ponieważ ustawiamy Vector jako metatabelę wszystkich instancji, wszystkie automatycznie współdzielą to zachowanie.
Wyzwanie
ŁatwyZbudujmy klasę Vector, która obsługuje dodawanie za pomocą operatora +. To Twój pierwszy krok w kierunku przeciążania operatorów, dzięki któremu Twoje obiekty będą naturalnie współpracować z wbudowanymi operatorami Lua.
Rozmieścisz swój kod w dwóch plikach:
Vector.lua: Zdefiniuj klasę Vector z komponentamixiy. Dodaj konstruktor:new(x, y)i zaimplementuj metametodę__add, aby dodanie dwóch wektorów tworzyło nowy wektor z połączonymi komponentami. Pamiętaj, że__addużywa składni z kropką (a nie dwukropkiem) i otrzymuje oba operandy jako argumenty.main.lua: Załaduj moduł Vector, utwórz instancje wektorów i pokaż, że ich dodanie daje prawidłowy wynik.
Otrzymasz cztery dane wejściowe:
- Komponent x pierwszego wektora
- Komponent y pierwszego wektora
- Komponent x drugiego wektora
- Komponent y drugiego wektora
W głównym pliku utwórz dwa wektory z podanymi komponentami, dodaj je do siebie za pomocą operatora + i wypisz wartości x i y wynikowego wektora w osobnych wierszach.
Na przykład, jeśli dane wejściowe to 3, 4, 1, 2, wynik powinien wyglądać tak:
4
6Pierwszy wektor (3, 4) plus drugi wektor (1, 2) daje nowy wektor (4, 6).
Spróbuj swoich sił
-- Załaduj moduł Vector
local Vector = require('Vector')
-- Odczytaj dane wejściowe
local x1 = tonumber(io.read())
local y1 = tonumber(io.read())
local x2 = tonumber(io.read())
local y2 = tonumber(io.read())
-- TODO: Utwórz dwie instancje Vector, używając wartości wejściowych
-- TODO: Dodaj dwa wektory za pomocą operatora +
-- TODO: Wypisz wartości x i y wynikowego wektora w osobnych wierszach
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