Menu
Coddy logo textTech

Varsayılanları Geçersiz Kılma

Coddy'nin Rust Journey'sinin Object Oriented Programming bölümünün bir parçası. Ders 32 / 61.

default implementation kullanışlıdır, ancak bazen bir türün standarttan farklı bir davranışa ihtiyacı olur. Bu gerçekleştiğinde, impl bloğunda kendi implementation'ınızı sağlayarak default'u override edebilirsiniz.

Yöntemi aynı imzayla tanımlayın, ancak özel mantığınızı ekleyin:

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

Greet bir default greet method'u sağlasa da, Robot onu tamamen kendi sürümüyle değiştirir. Bir Robot üzerinde greet() çağırdığında Rust, özel implementation'ı kullanır:

let bot = Robot { id: 42 };
println!("{}", bot.greet());  // BEEP BOOP. Birim 42 çevrimiçi.

Bu sana esneklik sağlar: default ile uyumlu olan türlerin hiçbir şey yazmasına gerek yoktur; özel davranışa ihtiyaç duyan türler ise yalnızca önemsedikleri method'ları override edebilir. trait yine de her uygulayan türün method'u kullanılabilir durumda bulundurmasını garanti eder.

challenge icon

Görev

Kolay

Farklı alert türlerinin mesajlarını özelleştirebildiği bir notification system oluşturalım! default implementation içeren bir trait oluşturacak, ardından bir türün default olanı kullanmasını, diğerinin ise bunu custom behavior ile override etmesini sağlayacaksın.

Code'unu üç dosyaya ayıracaksın:

  • notifiable.rs: Bir public Notifiable trait'i ve default implementation'a sahip, "Alert: Something happened!" döndüren bir notify(&self) -> String method'u Define et.
  • alerts.rs: trait'ini farklı şekilde implement eden iki public struct Create et:
    • GenericAlert: default notification kullanan bir unit struct (empty impl block)
    • UrgentAlert: public bir message field'ına (String) sahip olan ve {message} değerinin stored message olduğu durumda, default'u "URGENT: {message}" döndürecek şekilde override eden bir struct
  • main.rs: module'lerini bir araya getir ve her iki behavior'ı da göster. Input kullanarak bir GenericAlert ve bir UrgentAlert Create et, ardından notification'larını Print et.

Buradaki temel içgörü, GenericAlert'ın default sayesinde ücretsiz behavior elde etmesi, UrgentAlert'ın ise method'u kendi impl block'unda Define ederek kendi specialized version'ını sağlamasıdır.

Output'un şu formatı izlemesi gerekir:

Alert: Something happened!
URGENT: {message}

Örneğin, Server is down! input'u ile:

Alert: Something happened!
URGENT: Server is down!

Bir input alacaksın: urgent alert için message.

Kendin dene

mod notifiable;
mod alerts;

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

fn main() {
    // Acil uyarı mesajı için girişi oku
    let mut input = String::new();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let message = input.trim().to_string();

    // TODO: Bir GenericAlert örneği oluştur

    // TODO: Girdi mesajıyla bir UrgentAlert örneği oluştur

    // TODO: GenericAlert'ten bildirimi yazdır

    // TODO: UrgentAlert'ten bildirimi yazdır
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Object Oriented Programming bölümündeki tüm dersler

Kendi başına pratik yap: Online Rust derleyicisi