Menu
CoddyTech

Mengganti Implementasi Bawaan

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Rust di Coddy. Pelajaran 32 dari 61.

Implementasi default memang praktis, tetapi terkadang suatu tipe memerlukan perilaku yang berbeda dari standar. Jika ini terjadi, kamu dapat mengganti implementasi default dengan menyediakan implementasimu sendiri di blok impl.

Cukup definisikan method dengan signature yang sama, tetapi sertakan logika kustommu:

trait Greet {
    fn greet(&self) -> String {
        String::from("Hello there!")
    }
}

struct Robot {
    id: u32,
}

impl Greet for Robot {
    fn greet(&self) -> String {
        format!("BEEP BOOP. Unit {} online.", self.id)
    }
}

Meskipun Greet menyediakan method greet default, Robot menggantinya sepenuhnya dengan versinya sendiri. Saat kamu memanggil greet() pada Robot, Rust menggunakan implementasi khusus:

let bot = Robot { id: 42 };
println!("{}", bot.greet());  // BEEP BOOP. Unit 42 aktif.

Ini memberimu fleksibilitas: tipe yang cocok dengan perilaku default tidak perlu menulis apa pun, sedangkan tipe yang membutuhkan perilaku khusus dapat mengganti hanya method yang diperlukan. Trait tetap menjamin bahwa setiap tipe yang mengimplementasikannya memiliki method tersebut.

challenge icon

Tantangan

Mudah

Mari buat sistem notifikasi yang memungkinkan berbagai jenis alert menyesuaikan pesannya! Kamu akan membuat trait dengan implementasi default, lalu membuat satu tipe menggunakan default tersebut dan tipe lainnya menimpanya dengan perilaku khusus.

Kamu akan mengatur kodemu dalam tiga file:

  • notifiable.rs: Definisikan trait publik Notifiable dengan method notify(&self) -> String yang memiliki implementasi default dan mengembalikan "Alert: Something happened!".
  • alerts.rs: Buat dua struct publik yang mengimplementasikan trait-mu dengan cara berbeda:
    • GenericAlert: struct unit yang menggunakan notifikasi default (blok impl kosong)
    • UrgentAlert: struct dengan field message publik (String) yang menimpa default untuk mengembalikan "URGENT: {message}", dengan {message} sebagai pesan yang disimpannya
  • main.rs: Satukan module-mu dan tunjukkan kedua perilaku tersebut. Buat GenericAlert dan UrgentAlert menggunakan input yang diberikan, lalu cetak notifikasinya.

Inti pentingnya adalah GenericAlert mendapatkan perilaku bawaan secara otomatis, sedangkan UrgentAlert menyediakan versinya sendiri yang khusus dengan mendefinisikan method di blok impl-nya.

Output-mu harus mengikuti format ini:

Alert: Something happened!
URGENT: {message}

Contohnya, dengan input Server is down!:

Alert: Something happened!
URGENT: Server is down!

Kamu akan menerima satu input: pesan untuk alert mendesak.

Coba sendiri

mod notifiable;
mod alerts;

use alerts::{GenericAlert, UrgentAlert};
use notifiable::Notifiable;

fn main() {
    // Baca input untuk pesan peringatan mendesak
    let mut input = String::new();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let message = input.trim().to_string();

    // TODO: Buat instance GenericAlert

    // TODO: Buat instance UrgentAlert dengan pesan dari input

    // TODO: Tampilkan notifikasi dari GenericAlert

    // TODO: Tampilkan notifikasi dari UrgentAlert
}
quiz iconUji dirimu

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

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Rust online