Dziedziczenie metod
Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 32 z 70.
Po ustanowieniu relacji dziedziczenia instancje klas potomnych automatycznie zyskują dostęp do wszystkich metod klas nadrzędnych. Dzieje się tak za pośrednictwem łańcucha wyszukiwania Lua: gdy wywołujesz metodę na instancji, Lua przeszukuje połączone tabele, aż znajdzie to, czego szukasz.
Rozważmy konfigurację, w której Animal definiuje metodę :breathe():
local Animal = {}
Animal.__index = Animal
function Animal:new()
local obj = {}
setmetatable(obj, Animal)
return obj
end
function Animal:breathe()
print("Breathing...")
end
-- Dog dziedziczy po Animal
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
function Dog:new()
local obj = {}
setmetatable(obj, Dog)
return obj
endTeraz zobacz, co się stanie, gdy utworzymy obiekt Dog i wywołamy metodę rodzica:
local buddy = Dog:new()
buddy:breathe() -- Wynik: Breathing...Klasa Dog nigdy nie definiowała :breathe(), a mimo to to działa. Lua najpierw sprawdza buddy i niczego nie znajduje, potem sprawdza Dog — nadal nic — a w końcu znajduje tę metodę w Animal. To automatyczne dziedziczenie metod oznacza, że wspólne zachowanie definiujesz raz w klasie nadrzędnej, a każda klasa potomna od razu z niego korzysta.
Wyzwanie
ŁatwyStwórzmy prostą hierarchię stworzeń, aby zobaczyć dziedziczenie metod w praktyce! Utworzysz klasę nadrzędną Animal i klasę podrzędną Dog, a następnie pokażesz, że instancje Dog mogą korzystać z metod zdefiniowanych tylko w Animal.
Rozmieścisz swój kod w trzech plikach:
Animal.lua: Zdefiniuj klasę nadrzędną, stosując standardowy wzorzec klas. Dodaj konstruktor:new(name), który zapisuje imię zwierzęcia, oraz metodę:speak(), która wyświetla imię zwierzęcia, a następniemakes a sound. Zwróć klasę na końcu pliku.Dog.lua: Zdefiniuj klasę podrzędną dziedziczącą po Animal. Załaduj moduł Animal i skonfiguruj relację dziedziczenia, aby Dog mógł korzystać z metod Animal. Dodaj konstruktor:new(name), który zapisuje imię i ustawia Dog jako metatabelę. Klasa Dog NIE powinna definiować własnej metody:speak(). Odziedziczy ją z Animal.main.lua: Załaduj moduł Dog, odczytaj imię z wejścia, utwórz instancję Dog z tym imieniem i wywołaj na niej metodę:speak().
Otrzymasz jedno wejście: imię psa.
Na przykład, jeśli wejściem jest Buddy, wynikiem powinno być:
Buddy makes a soundCała magia polega na tym, że klasa Dog nigdy nie definiuje :speak(), a mimo to wywołanie tej metody na instancji Dog działa bez zarzutu. Lua sprawdza kolejne elementy łańcucha wyszukiwania: od instancji Dog do klasy Dog, a następnie do klasy Animal, gdzie znajduje metodę. Tak właśnie działa dziedziczenie!
Spróbuj swoich sił
-- main.lua: Punkt wejścia
local Dog = require('Dog')
-- Odczytaj imię psa z wejścia
local name = io.read()
-- TODO: Utwórz instancję Dog o podanym imieniu
-- TODO: Wywołaj metodę :speak() na instancji Dog
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