Sama vs Unik
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 35 dari 70.
Saat bekerja dengan pewarisan, penting untuk memahami di mana setiap bagian data berada. Beberapa atribut digunakan bersama: didefinisikan di kelas induk dan dapat diakses oleh semua kelas anak. Atribut lainnya unik: dibuat khusus di kelas atau instans anak.
Pertimbangkan hierarki ini:
local Animal = {}
Animal.__index = Animal
Animal.kingdom = "Animalia" -- 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" -- Digunakan 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 instance Dog, beberapa nilai ada langsung pada object, sementara yang lain 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"-- Dipakai bersama (ditemukan melalui pencarian)
print(rex.sound) -- "bark" (dari Dog)
print(rex.kingdom) -- "Animalia" (dari Animal)Perbedaan utamanya: field yang ditetapkan ke obj dalam konstruktor bersifat unik untuk setiap instance, sedangkan field yang didefinisikan langsung pada tabel class dibagikan ke semua instance class tersebut dan turunannya.
Tantangan
MudahMari telusuri bagaimana data mengalir melalui hierarki pewarisan dengan membuat sistem class Creature dan Dragon. Kamu akan melihat langsung atribut mana yang digunakan bersama 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 bersamaworld = "Fantasy Realm"yang digunakan oleh semua makhluk. Sertakan konstruktor:new(name)yang menyimpan nama makhluk sebagai atribut instance.Dragon.lua: Definisikan class anak yang mewarisi Creature. Tambahkan atribut tingkat class bersamaelement = "fire"yang digunakan oleh semua naga. Konstruktor:new(name, color)milikmu harus memanggil konstruktor induk untuk nama, lalu menambahkancolorsebagai atribut instance unik untuk setiap naga.main.lua: Buat dua naga yang berbeda dan periksa atributnya untuk menunjukkan perbedaan antara data bersama dan data unik.
Kamu akan menerima dua input:
- Nama dan warna naga pertama, dipisahkan dengan koma (misalnya,
Smaug,red) - Nama dan warna naga kedua, dipisahkan dengan koma (misalnya,
Draco,gold)
Dalam file utamamu, buat kedua naga dengan nama dan warna masing-masing. Lalu cetak informasi berikut dengan urutan yang sama persis:
namenaga pertamacolornaga pertamanamenaga keduacolornaga keduaelementnaga pertama (digunakan bersama dari class Dragon)elementnaga kedua (digunakan bersama dari class Dragon)worldnaga pertama (digunakan bersama dari class Creature)
Misalnya, jika inputnya adalah Smaug,red dan Draco,gold, outputnya akan seperti ini:
Smaug
red
Draco
gold
fire
fire
Fantasy RealmPerhatikan bahwa name dan color berbeda untuk setiap naga (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-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