Sama vs Unik
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 35 dari 70.
Saat bekerja dengan pewarisan, penting untuk memahami tempat setiap bagian data disimpan. Beberapa atribut dibagikan: didefinisikan di parent dan dapat diakses oleh semua child. Atribut lainnya unik: dibuat khusus di class atau instance child.
Pertimbangkan hierarki ini:
local Animal = {}
Animal.__index = Animal
Animal.kingdom = "Animalia" -- Dipakai bersama: didefinisikan pada class
function Animal:new(name)
local obj = {name = name} -- Unik: disimpan pada setiap instance
setmetatable(obj, Animal)
return obj
endlocal Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
Dog.sound = "bark" -- Dimiliki bersama oleh semua Dog
function Dog:new(name, breed)
local obj = Animal.new(Animal, name)
obj.breed = breed -- Unik: setiap Dog memiliki breed sendiri
setmetatable(obj, Dog)
return obj
endSaat kamu membuat instans Dog, beberapa nilai ada langsung pada object, sementara nilai lainnya ditemukan melalui rantai pencarian:
local rex = Dog:new("Rex", "German Shepherd")
-- Khusus untuk instance ini (disimpan di rex)
print(rex.name) -- "Rex"
print(rex.breed) -- "German Shepherd"-- Digunakan bersama (ditemukan melalui pencarian)
print(rex.sound) -- "bark" (dari Dog)
print(rex.kingdom) -- "Animalia" (dari Animal)Perbedaan utamanya: field yang ditetapkan ke obj di dalam constructor bersifat unik untuk setiap instance, sedangkan field yang didefinisikan langsung pada tabel class digunakan bersama oleh semua instance class tersebut dan turunannya.
Tantangan
MudahMari pelajari bagaimana data mengalir melalui hierarki pewarisan dengan membangun sistem class Creature dan Dragon. Kamu akan melihat langsung atribut mana yang dibagikan oleh semua instance dan mana yang unik untuk setiap object.
Kamu akan menyusun kodemu dalam tiga file:
Creature.lua: Definisikan class induk dengan atribut tingkat class bersama,world = "Fantasy Realm", yang dibagikan oleh semua creature. Sertakan constructor:new(name)yang menyimpan nama creature sebagai atribut instance.Dragon.lua: Definisikan class turunan yang mewarisi dari Creature. Tambahkan atribut tingkat class bersama,element = "fire", yang dibagikan oleh semua dragon. Constructor:new(name, color)harus memanggil constructor induk untuk nama, lalu menambahkancolorsebagai atribut instance unik untuk setiap dragon.main.lua: Buat dua dragon berbeda dan periksa atributnya untuk menunjukkan perbedaan antara data bersama dan data unik.
Kamu akan menerima dua input:
- Nama dan warna dragon pertama, dipisahkan dengan koma (misalnya,
Smaug,red) - Nama dan warna dragon kedua, dipisahkan dengan koma (misalnya,
Draco,gold)
Di file utamamu, buat kedua dragon dengan nama dan warna masing-masing. Lalu cetak informasi berikut dalam urutan persis ini:
namedragon pertamacolordragon pertamanamedragon keduacolordragon keduaelementdragon pertama (dibagikan dari class Dragon)elementdragon kedua (dibagikan dari class Dragon)worlddragon pertama (dibagikan dari class Creature)
Misalnya, jika inputnya adalah Smaug,red dan Draco,gold, outputnya seharusnya:
Smaug
red
Draco
gold
fire
fire
Fantasy RealmPerhatikan bahwa name dan color berbeda untuk setiap dragon (atribut instance unik), sedangkan element dan world sama untuk keduanya (atribut class bersama yang ditemukan melalui rantai pencarian).
Coba sendiri
-- main.lua: Buat naga dan tunjukkan atribut bersama serta atribut unik
local Dragon = require('Dragon')
-- Baca input untuk naga pertama (name,color)
local input1 = io.read()
-- Baca input untuk naga kedua (name,color)
local input2 = io.read()
-- TODO: Uraikan input pertama untuk mengambil nama dan warna
-- Petunjuk: Gunakan string.match dengan pola "([^,]+),([^,]+)"
-- TODO: Uraikan input kedua untuk mengambil nama dan warna
-- TODO: Buat naga pertama dengan nama dan warnanya
-- TODO: Buat naga kedua dengan nama dan warnanya
-- TODO: Cetak hal berikut secara berurutan:
-- 1. Nama naga pertama
-- 2. Warna naga pertama
-- 3. Nama naga kedua
-- 4. Warna naga kedua
-- 5. Elemen naga pertama (digunakan bersama dari class Dragon)
-- 6. Elemen naga kedua (digunakan bersama dari class Dragon)
-- 7. Dunia naga pertama (digunakan bersama dari class Creature)
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Konsep "Self"
Tabel dengan Fungsi'self' EksplisitSintaks Titik DuaTitik vs Titik DuaRangkuman, Titik Bergerak4Proyek: Bank Digital
Penyiapan Proyekmethod Setoran7Polimorfisme & Overriding
Menimpa methodMemanggil method indukDuck TypingAntarmuka UmumMemeriksa TipeRingkasan: Peran Karyawan10Proyek: Pengelola Bentuk
Penyiapan Proyekclass Rectangleclass Circlemethod KelilingKumpulan BentukLuas TotalSaring Bentuk2Pola Prototype untuk class
Konsep PrototypeMenghubungkan dengan __indexKonstruktor :new()Menginisialisasi AtributInstans yang MandiriRangkuman: Pabrik Mobil5Pembebanan Operator dalam OOP
Menjumlahkan ObjekMengurangkan ObjekMenggabungkan ObjekMembandingkan Objek (<, >)Ulasan: Aritmetika Dompet8Enkapsulasi
Konvensi PenamaanClosure untuk PrivasiAkses melalui ClosureTabel Hanya-BacaLogika ValidasiRangkuman: Brankas Aman11Pola Desain (Ringan)
Fungsi FactoryTabel SingletonPola IteratorObserver (Listener)Rangkuman, Factory Logger3State dan Behavior pada object
Variabel InstansGetter methodSetter methodProperty TerhitungMemformat stringPemeriksaan KesetaraanRangkuman: Nilai Siswa6Dasar-Dasar Pewarisan
Menyiapkan PewarisanMewarisi methodMemperluas KonstruktorMenambahkan method untuk ChildSama vs UnikRangkuman: Hierarki BentukLatihan sendiri: Compiler Lua online