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.
Tantangan
MudahMari 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 publikNotifiabledengan methodnotify(&self) -> Stringyang 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 fieldmessagepublik (String) yang menimpa default untuk mengembalikan"URGENT: {message}", dengan{message}sebagai pesan yang disimpannya
main.rs: Satukan module-mu dan tunjukkan kedua perilaku tersebut. BuatGenericAlertdanUrgentAlertmenggunakan 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
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Method dan Perilaku
Pengantar Blok ImplementasiParameter SelfMethod MutableFungsi TerkaitBeberapa Blok ImplementasiMethod BerantaiRangkuman: Aksi Persegi Panjang4Proyek: Hewan Peliharaan Virtual
Mendefinisikan Hewan PeliharaanMemberi Makan Hewan Peliharaan2Enkapsulasi dan module
Dasar-Dasar moduleKata Kunci publicField privateGetterSetterRekap: Loker Aman3Enum Lanjutan
Enum dengan Datamethod pada EnumMencocokkan Varian DataMeninjau Kembali Enum OptionRingkasan: Enum Shape6Definisi Trait
Apa itu Trait?Mengimplementasikan TraitImplementasi BawaanMengganti Implementasi BawaanTrait dengan ParameterRangkuman: Pemutar MediaLatihan sendiri: Compiler Rust online