Menu
Coddy logo textTech

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
end

Teraz 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.

challenge icon

Wyzwanie

Łatwy

Stwó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ępnie makes 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 sound

Cał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
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