Menu
CoddyTech

Hubungan Has-A

Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 49 dari 70.

Sepanjang kursus ini, kamu telah menggunakan pewarisan untuk berbagi perilaku antar-class: Dog adalah Animal. Namun, pewarisan tidak selalu menjadi alat yang tepat.

Terkadang, object tidak memiliki pohon keluarga yang sama. Sebaliknya, satu object hanya berisi object lain. Ini disebut komposisi, dan ini menggambarkan hubungan "memiliki".

Bayangkan sebuah mobil. Mobil bukanlah tipe mesin. Mobil memiliki mesin. Mesin adalah object terpisah yang berada di dalam mobil:

local Engine = {}
Engine.__index = Engine

function Engine:new(horsepower)
    local obj = {horsepower = horsepower}
    setmetatable(obj, Engine)
    return obj
end

local Car = {}
Car.__index = Car

function Car:new(model, engine)
    local obj = {
        model = model,
        engine = engine  -- Simpan object Engine di dalam Car
    }
    setmetatable(obj, Car)
    return obj
end

Saat membuat mobil, kamu memberikan object mesin yang sudah ada ke konstruktornya:

local myEngine = Engine:new(200)
local myCar = Car:new("Sedan", myEngine)

print(myCar.engine.horsepower)  -- 200

Mobil tidak mewarisi dari mesin. Mobil hanya menyimpan referensi ke mesin. Dengan begitu, kedua class tetap independen. Kamu bisa menggantinya dengan mesin lain, atau menggunakan class mesin yang sama pada sepeda motor.

Komposisi memberimu fleksibilitas yang tidak bisa diberikan oleh pewarisan: kamu menyusun object dari berbagai bagian, alih-alih menguncinya dalam hierarki keluarga yang kaku.

challenge icon

Tantangan

Mudah

Mari bangun sistem komputer menggunakan komposisi! Alih-alih pewarisan, kamu akan membuat Computer yang memiliki CPU di dalamnya: menunjukkan hubungan "has-a".

Kamu akan mengatur kodemu dalam tiga file:

  • CPU.lua: Buat class CPU dengan constructor :new(brand, speed) yang menyimpan nama merek dan kecepatan dalam GHz. Sertakan method :getInfo() yang mengembalikan string dalam format: {brand} @ {speed}GHz
  • Computer.lua: Buat class Computer yang constructornya :new(model, cpu) menerima nama model dan object CPU. Computer menyimpan object CPU di dalam dirinya sendiri (komposisi!). Sertakan method :describe() yang mencetak model komputer dan info CPU-nya.
  • main.lua: Satukan semuanya! Baca input untuk merek CPU, kecepatan CPU, dan model komputer. Buat object CPU terlebih dahulu, lalu berikan object itu ke constructor Computer. Terakhir, panggil method :describe() milik komputer.

Kamu akan menerima tiga input:

  1. Merek CPU (sebuah string)
  2. Kecepatan CPU dalam GHz (sebuah angka)
  3. Nama model komputer (sebuah string)

Output-mu harus menampilkan deskripsi komputer, yang mencakup informasi dari CPU yang tersimpan di dalamnya:

Model: {model}
CPU: {brand} @ {speed}GHz

Misalnya, jika input-nya adalah Intel, 3.5, dan WorkStation, output-nya harus berupa:

Model: WorkStation
CPU: Intel @ 3.5GHz

Perhatikan bahwa Computer tidak mewarisi dari CPU. Computer hanya menyimpan referensi ke CPU. Method :describe() milik Computer mengakses data CPU melalui object yang disimpan, menunjukkan bagaimana komposisi memungkinkan kamu membangun object kompleks dari bagian-bagian yang lebih sederhana!

Coba sendiri

-- main.lua
-- Gabungkan semuanya menggunakan komposisi

local CPU = require('CPU')
local Computer = require('Computer')

-- Baca input
local cpuBrand = io.read()
local cpuSpeed = tonumber(io.read())
local computerModel = io.read()

-- TODO: Buat object CPU dengan merek dan kecepatannya

-- TODO: Buat object Computer dengan model dan object CPU

-- TODO: Panggil method describe() milik computer untuk mencetak output
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