Odejmowanie obiektów
Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 27 z 70.
Tak jak __add obsługuje operator +, metametoda __sub definiuje działanie operatora -. Wzorzec jest identyczny. Definiujesz funkcję, która przyjmuje dwa operandy i zwraca nowy obiekt.
local Color = {}
Color.__index = Color
function Color:new(r, g, b)
local obj = {r = r, g = g, b = b}
setmetatable(obj, Color)
return obj
end
function Color.__sub(c1, c2)
return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
endPodczas pracy z kolorami RGB odejmowanie może dawać wartości ujemne. W rzeczywistych aplikacjach możesz chcieć ograniczać wyniki do prawidłowych zakresów (0-255), ale podstawowa struktura metametody pozostaje taka sama.
local bright = Color:new(200, 150, 100)
local dim = Color:new(50, 30, 20)
local result = bright - dim
print(result.r, result.g, result.b) -- Wynik: 150 120 80Pamiętaj: zdefiniuj __sub z kropką (nie dwukropkiem), ponieważ to metametoda, którą Lua wywołuje bezpośrednio, przekazując oba operandy jako argumenty.
Wyzwanie
ŁatwyZbudujmy klasę Color, która obsługuje odejmowanie za pomocą operatora -. Kolory są reprezentowane przez wartości RGB, a odjęcie jednego koloru od drugiego tworzy nowy kolor z różnicami poszczególnych składowych.
Podzielisz swój kod na dwa pliki:
Color.lua: Zdefiniuj klasę Color ze składowymir,gib, reprezentującymi wartości czerwieni, zieleni i błękitu. Dodaj konstruktor:new(r, g, b)i zaimplementuj metametodę__sub, aby odejmowanie dwóch kolorów tworzyło nowy kolor z różnicami poszczególnych składowych. Pamiętaj, że__subużywa składni z kropką i otrzymuje oba operandy jako argumenty.main.lua: Załaduj moduł Color, utwórz instancje kolorów na podstawie podanych danych wejściowych, odejmij je od siebie i wyświetl wynikowe wartości RGB.
Otrzymasz sześć danych wejściowych:
- Składowa czerwieni pierwszego koloru
- Składowa zieleni pierwszego koloru
- Składowa błękitu pierwszego koloru
- Składowa czerwieni drugiego koloru
- Składowa zieleni drugiego koloru
- Składowa błękitu drugiego koloru
W głównym pliku utwórz dwa kolory z podanych wartości RGB, odejmij drugi kolor od pierwszego za pomocą operatora - i wypisz wartości r, g i b wynikowego koloru w osobnych wierszach.
Na przykład, jeśli dane wejściowe to 200, 150, 100, 50, 30, 20, wynikiem powinno być:
150
120
80Pierwszy kolor (200, 150, 100) minus drugi kolor (50, 30, 20) daje nowy kolor (150, 120, 80).
Spróbuj swoich sił
-- Załaduj moduł Color
local Color = require('Color')
-- Odczytaj wartości wejściowe
local r1 = tonumber(io.read())
local g1 = tonumber(io.read())
local b1 = tonumber(io.read())
local r2 = tonumber(io.read())
local g2 = tonumber(io.read())
local b2 = tonumber(io.read())
-- TODO: Utwórz dwie instancje Color o podanych wartościach RGB
-- TODO: Odejmij drugi kolor od pierwszego za pomocą operatora -
-- TODO: Wypisz wartości r, g i b wynikowego koloru 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