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
endSaat 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) -- 200Mobil 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.
Tantangan
MudahMari 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}GHzComputer.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:
- Merek CPU (sebuah string)
- Kecepatan CPU dalam GHz (sebuah angka)
- 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}GHzMisalnya, jika input-nya adalah Intel, 3.5, dan WorkStation, output-nya harus berupa:
Model: WorkStation
CPU: Intel @ 3.5GHzPerhatikan 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
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 Bentuk9Komposisi & Mixins
Hubungan Has-ADelegasiMixins SederhanaMenerapkan Beberapa MixinsMixins vs PewarisanRangkuman: Perakitan RobotLatihan sendiri: Compiler Lua online