Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 publik Notifiable dengan method notify(&self) -> String yang 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: mengimplementasikan Notifiable dengan blok impl kosong (menggunakan implementasi default)
    • SystemAlert: juga mengimplementasikan Notifiable dengan blok impl kosong (menggunakan implementasi default)
    Kedua struct akan otomatis mendapatkan pesan notifikasi default tanpa kamu menulis isi method apa pun!
  • main.rs: Satukan module-mu dan tunjukkan bagaimana kedua tipe alert memiliki perilaku default yang sama. Buat instance dari kedua struct dan panggil method notify mereka.

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
}
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