Varsayılan Uygulamalar
Coddy'nin Rust Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 31 / 61.
Şimdiye kadar tanımladığımız her özellik yöntemi yalnızca bir imzaydı: gövdesi olmayan bir gereksinim. Peki ya bir özelliği uygulayan türlerin çoğu aynı mantığı kullanacaksa? Rust, özelliğin tanımı içinde doğrudan bir varsayılan uygulama sağlamanıza olanak tanır.
Yöntem imzasını noktalı virgülle sonlandırmak yerine bir gövde eklersin:
trait Greet {
fn greet(&self) -> String {
String::from("Hello there!")
}
}
Artık Greet uygulayan herhangi bir tür, impl bloğuna herhangi bir kod yazmadan bu metodu otomatik olarak edinir:
struct Guest;
impl Greet for Guest {}
let visitor = Guest;
println!("{}", visitor.greet()); // Merhaba!
Boş impl Greet for Guest {} geçerlidir çünkü trait davranışı zaten sağlar. Struct, trait’i basitçe "kullanmayı seçer" ve varsayılan metodu ücretsiz olarak alır.
Bu kalıp, çoğu durum için çalışan ortak davranışı define etmek istediğinizde kullanışlıdır. Farklı bir şeye ihtiyaç duyan türler default olanı (bunu bir sonraki bölümde öğreneceksiniz) geçersiz kılabilirken standart davranıştan memnun olan türlerin kendilerini tekrar etmesine gerek yoktur.
Görev
KolayBir bildirim sistemi oluşturarak varsayılan uygulamaların gücünü keşfedelim! Kutudan çıktığı hâliyle standart davranış sağlayan bir trait oluşturacaksın; böylece türler tekrarlayan kodlar yazmadan bu davranışı kullanmayı seçebilecek.
Kodunu üç dosya arasında düzenleyeceksin:
notifiable.rs: BirNotifiablemetoduna sahip, varsayılan bir uygulama sağlayan herkese açık birnotify(&self) -> Stringtrait'i tanımla. Varsayılan uygulama"You have a new notification!"döndürmeli. Bu trait'i uygulayan her tür, impl bloğuna herhangi bir şey yazmaya gerek kalmadan bu davranışı otomatik olarak alır.alerts.rs: Trait'ini uygulayan iki basit, herkese açık birim struct'ı oluştur:EmailAlert: boş bir impl bloğuylaNotifiableuygular (varsayılanı kullanır)SystemAlert: yine boş bir impl bloğuylaNotifiableuygular (varsayılanı kullanır)
main.rs: Modüllerini bir araya getir ve her iki uyarı türünün aynı varsayılan davranışı nasıl paylaştığını göster. Her iki struct'ın örneklerini oluştur venotifymetotlarını çağır.
Ana dosyanda bir EmailAlert ve bir SystemAlert oluştur, ardından bildirimlerini ayrı satırlara yazdır.
Çıktın şöyle olmalı:
You have a new notification!
You have a new notification!Her iki türün de aynı çıktıyı ürettiğine dikkat et: varsayılan uygulamaların güzelliği işte bu! Her iki struct'ın da notify metodu için herhangi bir kod yazması gerekmedi, ancak ikisi de tamamen işlevsel bildirim davranışına sahip. Bir sonraki derste, bir tür özel davranışa ihtiyaç duyduğunda bu varsayılanları nasıl geçersiz kılacağını öğreneceksin.
Kendin dene
mod notifiable;
mod alerts;
use notifiable::Notifiable;
use alerts::{EmailAlert, SystemAlert};
fn main() {
// TODO: EmailAlert örneği oluştur
// TODO: SystemAlert örneği oluştur
// TODO: Print the notification from EmailAlert
// TODO: Print the notification from SystemAlert
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama 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 PlayerKendi başına pratik yap: Online Rust derleyicisi