Menu
Coddy logo textTech

Dodawanie metod potomnych

Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 34 z 70.

Dziedziczenie pozwala klasom potomnym korzystać z metod klas nadrzędnych, ale prawdziwa siła tkwi w dodawaniu nowych metod, które ma tylko klasa potomna. Dog potrafi robić wszystko, co Animal, a do tego rzeczy charakterystyczne dla psów, takie jak szczekanie.

Dodanie metody specyficznej dla klasy potomnej jest proste: wystarczy zdefiniować ją w tabeli klasy potomnej. Ponieważ instancje najpierw szukają metod we własnej klasie, znajdą nową metodę bez wpływu na klasę nadrzędną.

local Animal = {}
Animal.__index = Animal

function Animal:new(name)
    local obj = {name = name}
    setmetatable(obj, Animal)
    return obj
end

function Animal:breathe()
    print(self.name .. " is breathing")
end

-- Dog dziedziczy po Animal
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})

function Dog:new(name)
    local obj = Animal.new(Animal, name)
    setmetatable(obj, Dog)
    return obj
end

-- Nowa metoda dostępna tylko w Dog
function Dog:bark()
    print(self.name .. " says: Woof!")
end

Teraz instancje Dog mogą używać zarówno odziedziczonych, jak i unikalnych metod:

local buddy = Dog:new("Buddy")
buddy:breathe()  -- Wynik: Buddy oddycha (odziedziczona metoda)
buddy:bark()     -- Wynik: Buddy mówi: Hau! (metoda dostępna tylko w klasie potomnej)

Klasa nadrzędna pozostaje bez zmian: wywołanie :bark() na zwykłym obiekcie Animal zakończyłoby się błędem, ponieważ ta metoda tam nie istnieje. W ten sposób dziedziczenie pozwala wyspecjalizować zachowanie, zachowując wspólną funkcjonalność w jednym miejscu.

challenge icon

Wyzwanie

Łatwy

Zbudujmy hierarchię zwierząt, w której koty mają własną wyjątkową umiejętność! Utworzysz klasę nadrzędną Pet i klasę podrzędną Cat, w której Cat dziedziczy wszystko z Pet, ale ma też unikatową metodę, z której mogą korzystać tylko koty.

Rozmieścisz swój kod w trzech plikach:

  • Pet.lua: Zdefiniuj klasę nadrzędną z konstruktorem :new(name), który zapisuje imię zwierzęcia. Dodaj metodę :greet(), która wypisuje imię zwierzęcia, a po nim says hello. Zastosuj standardowy wzorzec klasy i zwróć klasę.
  • Cat.lua: Zdefiniuj klasę podrzędną, która dziedziczy po Pet. Konstruktor :new(name) klasy Cat powinien wywołać konstruktor klasy nadrzędnej, aby zainicjować imię, a następnie ponownie powiązać metatabelę z Cat. Dodaj specyficzną dla klasy podrzędnej metodę :purr(), która wypisuje imię kota, a po nim purrs contentedly. Ta metoda istnieje tylko w Cat: Pet jej nie ma!
  • main.lua: Zaimportuj moduł Cat, odczytaj imię z wejścia, utwórz instancję Cat i pokaż, że może używać zarówno odziedziczonej metody :greet(), jak i własnej unikatowej metody :purr().

Otrzymasz jedno dane wejściowe: imię kota.

W pliku głównym utwórz obiekt Cat o podanym imieniu, a następnie wywołaj :greet(), po czym :purr() w osobnych wierszach.

Na przykład, jeśli dane wejściowe to Whiskers, dane wyjściowe powinny wyglądać tak:

Whiskers says hello
Whiskers purrs contentedly

Pierwszy wiersz pochodzi z odziedziczonej metody :greet() zdefiniowanej w Pet, a drugi z metody :purr(), która istnieje tylko w Cat. To pokazuje, jak klasy podrzędne mogą robić wszystko to, co ich klasa nadrzędna, a także wykonywać własne, wyspecjalizowane działania!

Spróbuj swoich sił

-- main.lua: Utwórz obiekt Cat i zademonstruj dziedziczenie

local Cat = require('Cat')

-- Odczytaj imię kota z danych wejściowych
local name = io.read()

-- TODO: Utwórz instancję Cat o podanym imieniu

-- TODO: Wywołaj odziedziczoną metodę :greet() (z Pet)

-- TODO: Wywołaj metodę :purr() specyficzną dla Cat
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