Niezależne instancje
Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 10 z 70.
Kluczowym aspektem programowania obiektowego jest to, że każda instancja zachowuje własny, odrębny stan. Gdy utworzysz dwa obiekty z tej samej klasy, będą one całkowicie niezależne: zmiana jednego nie wpłynie na drugi.
Rozważmy ten przykład:
local Counter = {}
Counter.__index = Counter
function Counter:new(start)
local instance = {}
setmetatable(instance, self)
instance.value = start or 0
return instance
end
function Counter:increment()
self.value = self.value + 1
end
-- Utwórz dwa osobne liczniki
local counterA = Counter:new(10)
local counterB = Counter:new(5)
counterA:increment()
counterA:increment()
print(counterA.value) -- Wynik: 12
print(counterB.value) -- Wynik: 5Mimo że oba liczniki pochodzą z tej samej klasy Counter, zwiększenie counterA nie ma wpływu na counterB. Każdy obiekt ma własne pole value przechowywane we własnej tabeli instancji.
Ta niezależność sprawia, że obiekty są przydatne. Możesz tworzyć w grze dziesiątki graczy, z których każdy śledzi własne zdrowie i wynik. Możesz zarządzać wieloma kontami bankowymi, z których każde ma inne saldo.
Klasa definiuje strukturę i zachowanie, ale każda instancja żyje własnym życiem i ma własne dane.
Wyzwanie
ŁatwyUdowodnijmy, że obiekty tej samej klasy naprawdę prowadzą niezależne życie! Zbudujesz klasę Wallet i utworzysz dwie osobne instancje portfela, a następnie zmodyfikujesz je niezależnie, aby pokazać, że zmiany w jednym nie wpływają na drugi.
Rozmieścisz swój kod w dwóch plikach:
Wallet.lua: Zdefiniuj klasęWalletze standardowym wzorcem konstruktora. Każdy portfel powinien śledzić własnebalance. Uwzględnij:- Konstruktor
:new(startingBalance), który inicjalizuje portfel podaną kwotą - Metodę
:add(amount), która zwiększa saldo - Metodę
:spend(amount), która zmniejsza saldo
- Konstruktor
main.lua: Załaduj moduł Wallet i utwórz dwie osobne instancje portfela. Wykonaj na każdej inne operacje, aby pokazać, że zachowują niezależny stan.
Otrzymasz cztery dane wejściowe:
- Saldo początkowe portfela A
- Saldo początkowe portfela B
- Kwota do dodania do portfela A
- Kwota do wydania z portfela B
W pliku głównym:
- Utwórz
walletAz pierwszym saldem początkowym - Utwórz
walletBz drugim saldem początkowym - Dodaj podaną kwotę do
walletA - Wydaj podaną kwotę z
walletB - Wypisz oba salda w osobnych wierszach
Wypisz końcowe salda dokładnie w tym formacie:
Wallet A: [balance]
Wallet B: [balance]Na przykład, jeśli dane wejściowe to 100, 50, 25 i 10, wynikiem powinno być:
Wallet A: 125
Wallet B: 40Zauważ, że dodanie środków do portfela A nie zmienia stanu portfela B, a wydanie środków z portfela B nie wpływa na portfel A: każda instancja zachowuje własne, oddzielne saldo.
Spróbuj swoich sił
-- Załaduj moduł Wallet
local Wallet = require('Wallet')
-- Odczytaj dane wejściowe
local startingA = tonumber(io.read())
local startingB = tonumber(io.read())
local addAmount = tonumber(io.read())
local spendAmount = tonumber(io.read())
-- TODO: Utwórz walletA z pierwszym saldem początkowym
-- TODO: Utwórz walletB z drugim saldem początkowym
-- TODO: Dodaj określoną kwotę do walletA
-- TODO: Wydaj określoną kwotę z walletB
-- TODO: Wypisz salda końcowe w wymaganym formacie
-- Format: "Wallet A: [balance]" i "Wallet B: [balance]"
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