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

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

challenge icon

Tantangan

Mudah

Mari 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 bersama world = "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 bersama element = "fire" yang digunakan oleh semua naga. Konstruktor :new(name, color) milikmu harus memanggil konstruktor induk untuk nama, lalu menambahkan color sebagai 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:

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

  1. name naga pertama
  2. color naga pertama
  3. name naga kedua
  4. color naga kedua
  5. element naga pertama (digunakan bersama dari class Dragon)
  6. element naga kedua (digunakan bersama dari class Dragon)
  7. world naga 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 Realm

Perhatikan 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)
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