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.

Varsayılan uygulamalar kullanışlıdır, ancak bazen bir türün standarttan farklı bir davranışa ihtiyacı olur. Bu durum gerçekleştiğinde, impl bloğunda kendi uygulamanızı sağlayarak varsayılanı geçersiz kılabilirsiniz.

Yöntemi aynı imzayla tanımlamanız, ancak kendi özel mantığınızı eklemeniz yeterlidir:

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 varsayılan bir greet metodu sağlasa da, Robot bunu tamamen kendi sürümüyle değiştirir. Bir Robot üzerinde greet() çağırdığınızda, Rust özel uygulamayı kullanır:

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

Bu size esneklik sağlar; varsayılan davranıştan memnun olan türlerin herhangi bir şey yazması gerekmezken, özel davranışa ihtiyaç duyan türler sadece ilgilendikleri metotları geçersiz kılabilirler (override). Trait, uygulayan her türün ilgili metoda sahip olduğunu garanti etmeye devam eder.

challenge icon

Görev

Kolay

Farklı uyarı türlerinin mesajlarını özelleştirebildiği bir bildirim sistemi kuralım! Varsayılan bir uygulamaya sahip bir trait oluşturacak, ardından bir türün varsayılanı kullanmasını sağlarken diğerinin bunu özel bir davranışla geçersiz kılmasını (override) sağlayacaksınız.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • notifiable.rs: Varsayılan uygulaması "Alert: Something happened!" döndüren bir notify(&self) -> String metoduna sahip, genel (public) bir Notifiable trait'i tanımlayın.
  • alerts.rs: Trait'inizi farklı şekilde uygulayan iki genel struct oluşturun:
    • GenericAlert — varsayılan bildirimi kullanan bir unit struct (boş impl bloğu)
    • UrgentAlert — varsayılanı geçersiz kılarak (override), {message} saklanan mesajı olmak üzere "URGENT: {message}" döndüren, genel bir message alanına (String) sahip bir struct.
  • main.rs: Modüllerinizi bir araya getirin ve her iki davranışı da sergileyin. Sağlanan girdiyi kullanarak bir GenericAlert ve bir UrgentAlert oluşturun, ardından bildirimlerini yazdırın.

Buradaki temel nokta, GenericAlert'in varsayılan uygulamadan doğrudan faydalanması, UrgentAlert'in ise metodu kendi impl bloğunda tanımlayarak kendi özelleştirilmiş sürümünü sunmasıdır.

Çıktınız şu formatta olmalıdır:

Alert: Something happened!
URGENT: {message}

Örneğin, Server is down! girdisi ile:

Alert: Something happened!
URGENT: Server is down!

Bir girdi alacaksınız: acil uyarı (urgent alert) için mesaj.

Kopya kağıdı

Varsayılan trait uygulamalarını, impl bloğunda kendi uygulamanızı sağlayarak geçersiz kılabilirsiniz:

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

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

Özel bir davranışa ihtiyaç duymayan türler, varsayılan uygulamayı kabul etmek için boş bir impl bloğu kullanabilirken, özelleştirilmiş davranış gerektiren türler, belirli metotları aynı imzayla tanımlayarak geçersiz kılabilir.

Kendin dene

mod notifiable;
mod alerts;

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

fn main() {
    // Acil uyarı mesajı için girdiyi 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ı ile bir UrgentAlert örneği oluştur

    // TODO: GenericAlert'ten gelen bildirimi yazdır

    // TODO: UrgentAlert'ten gelen 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