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.
Görev
KolayBir 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 sahipnotify(&self) -> Stringmetodunu içeren genel (public) birNotifiabletrait'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 ileNotifiabletrait'ini uygular (varsayılanı kullanır)SystemAlert— o da boş bir impl bloğu ileNotifiabletrait'ini uygular (varsayılanı kullanı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 venotifymetodları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
}
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
1Metotlar ve Davranış
Uygulama Bloklarına GirişSelf ParametresiDeğiştirilebilir Metotlarİlişkili FonksiyonlarBirden Fazla Uygulama BloğuMetot ZincirlemeÖzet - Dikdörtgen Eylemleri4Proje: Sanal Evcil Hayvan
Evcil Hayvanı TanımlamaEvcil Hayvanı Besleme2Kapsülleme ve Modüller
Modül TemelleriPublic Anahtar KelimesiPrivate AlanlarGetter'larSetter'larÖzet - Güvenli Kasa5Generic Yapılar
Generic Struct'larGeneric MetotlarÇoklu Generic TürlerGeneric FonksiyonlarÖzet - Koordinat Noktası8Sınırlandırıcı Olarak Trait'ler
Trait Sınırlandırıcı SözdizimiÇoklu SınırlandırıcılarWhere CümleciğiTrait'ler ile Tip DöndürmeÖzet - Generic Yazıcı11Rust'ta Tasarım Kalıpları
Newtype KalıbıKompozisyonDrop Trait'iFrom ve IntoÖzet - Smart Pointer Mock3İleri Seviye Enum'lar
Veri İçeren Enum'larEnum MetotlarıVeri Varyantlarını EşlemeOption Enum'ına Yeniden BakışÖzet - Shape Enum6Trait Tanımlama
Trait Nedir?Traitleri UygulamaVarsayılan UygulamalarVarsayılanları Geçersiz KılmaParametreli TraitlerÖzet - Media Player