Menu
Coddy logo textTech

Varsayılan Uygulamalar

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

Şimdiye kadar tanımladığımız her trait metodu sadece bir imzadan ibaretti; gövdesi olmayan bir gereksinim. Peki ya bir trait'i uygulayan çoğu tür aynı mantığı kullanacaksa? Rust, doğrudan trait tanımı içinde bir varsayılan uygulama sağlamanıza olanak tanır.

Metot imzasını noktalı virgül ile bitirmek yerine, bir gövde eklersiniz:

trait Greet {
    fn greet(&self) -> String {
        String::from("Hello there!")
    }
}

Artık Greet trait'ini uygulayan her tür, impl bloğuna herhangi bir kod yazmadan bu metodu otomatik olarak alır:

struct Guest;

impl Greet for Guest {}

let visitor = Guest;
println!("{}", visitor.greet());  // Merhaba!

Boş impl Greet for Guest {} geçerlidir çünkü trait zaten davranışı sağlar. Struct basitçe trait'e "dahil olur" ve varsayılan metodu doğrudan elde eder.

Bu desen, çoğu durum için işe yarayan ortak bir davranış tanımlamak istediğinizde kullanışlıdır. Farklı bir şeye ihtiyaç duyan türler varsayılanı geçersiz kılabilir (bunu bir sonraki bölümde öğreneceksiniz), standart davranıştan memnun olan türlerin ise kendilerini tekrar etmelerine gerek kalmaz.

challenge icon

Görev

Kolay

Bir bildirim sistemi oluşturarak varsayılan uygulamaların (default implementations) gücünü keşfedelim! Kutudan çıktığı haliyle standart davranış sağlayan bir trait oluşturacaksınız, böylece türler tekrarlayan kodlar yazmadan bu davranışı benimseyebilecekler.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • notifiable.rs: Varsayılan bir uygulamaya sahip notify(&self) -> String metodunu içeren genel (public) bir Notifiable trait'i tanımlayın. Varsayılan uygulama "You have a new notification!" değerini döndürmelidir. Bu trait'i uygulayan herhangi bir tür, impl bloğuna hiçbir şey yazmasına gerek kalmadan bu davranışı otomatik olarak alacaktır.
  • alerts.rs: Trait'inizi uygulayan iki basit genel birim struct (unit struct) oluşturun:
    • EmailAlert — boş bir impl bloğu ile Notifiable trait'ini uygular (varsayılanı kullanır)
    • SystemAlert — o da boş bir impl bloğu ile Notifiable trait'ini uygular (varsayılanı kullanır)
    Her iki struct da siz herhangi bir metod gövdesi yazmadan varsayılan bildirim mesajını otomatik olarak alacaktır!
  • main.rs: Modüllerinizi bir araya getirin ve her iki uyarı türünün de aynı varsayılan davranışı nasıl paylaştığını gösterin. Her iki struct'tan da örnekler oluşturun ve notify metodlarını çağırın.

Ana dosyanızda bir EmailAlert ve bir SystemAlert oluşturun, ardından bildirimlerini ayrı satırlara yazdırın.

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

You have a new notification!
You have a new notification!

Her iki türün de nasıl aynı çıktıyı ürettiğine dikkat edin; varsayılan uygulamaların güzelliği budur! Hiçbir struct notify metodu için herhangi bir kod yazmak zorunda kalmadı, ancak her ikisi de tam işlevsel bildirim davranışına sahip. Bir sonraki derste, bir türün özel bir davranışa ihtiyaç duyduğu durumlarda bu varsayılanları nasıl geçersiz kılacağınızı (override) öğreneceksiniz.

Kopya kağıdı

Trait metotları, sadece bir imza yerine bir metot gövdesi sağlanarak varsayılan uygulamalara sahip olabilir:

trait Greet {
    fn greet(&self) -> String {
        String::from("Hello there!")
    }
}

Trait'i uygulayan türler, herhangi bir kod yazmadan varsayılan davranışı otomatik olarak alırlar:

struct Guest;

impl Greet for Guest {}

let visitor = Guest;
println!("{}", visitor.greet());  // Hello there!

Trait varsayılan uygulamalar sağladığında boş bir impl bloğu geçerlidir. Bu, türlerin tekrara düşmeden paylaşılan davranışı seçmelerine olanak tanır.

Kendin dene

mod notifiable;
mod alerts;

use notifiable::Notifiable;
use alerts::{EmailAlert, SystemAlert};

fn main() {
    // YAPILACAK: EmailAlert örneği oluşturun
    
    // YAPILACAK: SystemAlert örneği oluşturun
    
    // YAPILACAK: EmailAlert bildirimini yazdırın
    
    // YAPILACAK: SystemAlert bildirimini yazdırın
}
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