Implementasi Bawaan
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Rust di Coddy. Pelajaran 31 dari 61.
Sejauh ini, setiap method trait yang kita definisikan hanya berupa signature: persyaratan tanpa body. Namun, bagaimana jika sebagian besar tipe yang mengimplementasikan trait akan menggunakan logika yang sama? Rust memungkinkan kamu menyediakan implementasi default langsung dalam definisi trait.
Alih-alih mengakhiri tanda tangan method dengan titik koma, kamu menambahkan body:
trait Greet {
fn greet(&self) -> String {
String::from("Hello there!")
}
}
Sekarang, tipe apa pun yang mengimplementasikan Greet otomatis mendapatkan method ini, tanpa perlu menulis kode apa pun di blok impl:
struct Guest;
impl Greet for Guest {}
let visitor = Guest;
println!("{}", visitor.greet()); // Halo!
impl Greet for Guest {} yang kosong valid karena trait sudah menyediakan perilakunya. Struct cukup "memilih untuk menggunakan" trait tersebut dan mendapatkan method bawaan secara gratis.
Pola ini berguna saat kamu ingin menentukan perilaku bersama yang berfungsi untuk sebagian besar kasus. Tipe yang memerlukan sesuatu yang berbeda dapat mengganti nilai bawaan (yang akan kamu pelajari selanjutnya), sementara tipe yang sudah cocok dengan perilaku standar tidak perlu mengulanginya.
Tantangan
MudahMari kita jelajahi kekuatan implementasi default dengan membangun sistem notifikasi! Kamu akan membuat trait yang menyediakan perilaku standar secara langsung, sehingga tipe dapat menggunakannya tanpa menulis kode berulang.
Kamu akan mengatur kodemu dalam tiga file:
notifiable.rs: Definisikan trait publikNotifiabledengan methodnotify(&self) -> Stringyang memiliki implementasi default. Implementasi default harus mengembalikan"You have a new notification!". Tipe apa pun yang mengimplementasikan trait ini akan otomatis mendapatkan perilaku tersebut tanpa perlu menulis apa pun di blok impl-nya.alerts.rs: Buat dua unit struct publik sederhana yang mengimplementasikan trait-mu:EmailAlert: mengimplementasikanNotifiabledengan blok impl kosong (menggunakan implementasi default)SystemAlert: juga mengimplementasikanNotifiabledengan blok impl kosong (menggunakan implementasi default)
main.rs: Satukan module-mu dan tunjukkan bagaimana kedua tipe alert memiliki perilaku default yang sama. Buat instance dari kedua struct dan panggil methodnotifymereka.
Di file utamamu, buat EmailAlert dan SystemAlert, lalu cetak notifikasi keduanya pada baris terpisah.
Output-mu seharusnya:
You have a new notification!
You have a new notification!Perhatikan bagaimana kedua tipe menghasilkan output yang sama: itulah keunggulan implementasi default! Kedua struct tidak perlu menulis kode apa pun untuk method notify, tetapi keduanya memiliki perilaku notifikasi yang berfungsi sepenuhnya. Di pelajaran berikutnya, kamu akan belajar cara mengganti implementasi default ini saat suatu tipe memerlukan perilaku khusus.
Coba sendiri
mod notifiable;
mod alerts;
use notifiable::Notifiable;
use alerts::{EmailAlert, SystemAlert};
fn main() {
// TODO: Buat instance dari EmailAlert
// TODO: Buat instance dari SystemAlert
// TODO: Cetak notifikasi dari EmailAlert
// TODO: Cetak notifikasi dari SystemAlert
}
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 AmanLatihan sendiri: Compiler Rust online