Konfiguracja dziedziczenia
Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 31 z 70.
Do tej pory tworzyłeś klasy, w których każdy obiekt wyszukuje metody w pojedynczej tablicy prototypów. Ale co, jeśli chcesz, aby jedna klasa bazowała na innej? Właśnie tu przydaje się dziedziczenie: klasa potomna może uzyskać dostęp do wszystkiego, co zawiera klasa nadrzędna, i jednocześnie dodawać własne funkcje.
Kluczowy wniosek jest taki, że sama tabela klasy może mieć metatabelę. Gdy Lua nie może czegoś znaleźć w klasie potomnej, szuka w __index metatabeli klasy potomnej, który wskazuje na klasę nadrzędną.
-- Klasa bazowa
local Animal = {}
Animal.__index = Animal
function Animal:new()
local obj = {}
setmetatable(obj, Animal)
return obj
end
function Animal:breathe()
print("Breathing...")
endA teraz konfiguracja dziedziczenia. Tworzymy klasę potomną i ustawiamy jej metatabelę tak, aby odwoływała się do klasy nadrzędnej:
-- Klasa potomna
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})Ta pojedyncza linia, setmetatable(Dog, {__index = Animal}), tworzy powiązanie dziedziczenia. Gdy instancja Dog wywołuje metodę, której nie znaleziono w Dog, Lua sprawdza Animal.
Łańcuch wyszukiwania działa tak: instancja → Dog → Animal. Każdy krok używa __index, aby znaleźć następną tabelę do przeszukania. Dzięki temu klasy potomne automatycznie dziedziczą wszystkie metody klas nadrzędnych bez ich kopiowania.
Wyzwanie
ŁatwyZbudujmy Twoją pierwszą hierarchię dziedziczenia! Utworzysz prostą relację między klasą nadrzędną i podrzędną, w której klasa Machine będzie klasą bazową, a klasa Robot będzie po niej dziedziczyć.
Rozmieścisz kod w trzech plikach:
Machine.lua: Zdefiniuj klasę nadrzędną, używając standardowego wzorca klas. Dodaj konstruktor:new()i metodę:status(), która wyświetlaMachine is operational. Nie zapomnij skonfigurować__indexi zwrócić klasy na końcu pliku.Robot.lua: Zdefiniuj klasę podrzędną, która dziedziczy po Machine. Załaduj moduł Machine, skonfiguruj tabelę Robot z własnym__indexi ustanów relację dziedziczenia za pomocąsetmetatable(Robot, {__index = Machine}). Dodaj konstruktor:new(), który tworzy instancję z Robot jako jej metatabelą.main.lua: Połącz wszystko, ładując moduł Robot, tworząc instancję Robot i wywołując odziedziczoną metodę:status().
Kluczowa koncepcja polega na tym, że klasa Robot nie definiuje samodzielnie metody :status(). Dziedziczy tę metodę po Machine za pośrednictwem łańcucha metatabel. Gdy wywołasz :status() na instancji Robot, Lua najpierw sprawdzi klasę Robot, nie znajdzie tam metody, a następnie podąży za odnośnikiem __index do Machine, gdzie ją znajdzie.
Oczekiwany wynik:
Machine is operationalTa pojedyncza linia dowodzi, że dziedziczenie działa. Robot pomyślnie uzyskał dostęp do metody zdefiniowanej wyłącznie w swojej klasie nadrzędnej!
Spróbuj swoich sił
-- main.lua: Połącz wszystko w całość
-- TODO: Załaduj moduł Robot za pomocą require
-- TODO: Utwórz instancję Robot za pomocą Robot:new()
-- TODO: Wywołaj odziedziczoną metodę :status() na swojej instancji robota
-- To powinno wyświetlić "Machine is operational"
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