Menu
CoddyTech

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
end
local 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
end

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

challenge icon

Tantangan

Mudah

Mari 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 menambahkan color sebagai 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:

  1. Nama dan warna dragon pertama, dipisahkan dengan koma (misalnya, Smaug,red)
  2. 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:

  1. name dragon pertama
  2. color dragon pertama
  3. name dragon kedua
  4. color dragon kedua
  5. element dragon pertama (dibagikan dari class Dragon)
  6. element dragon kedua (dibagikan dari class Dragon)
  7. world dragon pertama (dibagikan dari class Creature)

Misalnya, jika inputnya adalah Smaug,red dan Draco,gold, outputnya seharusnya:

Smaug
red
Draco
gold
fire
fire
Fantasy Realm

Perhatikan 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)
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler Lua online