Rust 語言本身不支持傳統的面向對象編程中的多態,因為它采用的是基于特性(traits)和泛型的系統。不過,Rust 提供了類似多態的功能,主要通過以下兩種方式實現:
trait Animal {
fn speak(&self);
}
struct Dog;
impl Animal for Dog {
fn speak(&self) {
println!("Woof!");
}
}
fn make_animal_speak(animal: &dyn Animal) {
animal.speak();
}
fn main() {
let dog = Dog;
make_animal_speak(&dog); // 輸出 "Woof!"
}
在這個例子中,Dog
結構體實現了 Animal
特征,然后我們創建了一個 Dog
類型的變量 dog
并將其傳遞給 make_animal_speak
函數。make_animal_speak
函數接受一個特征對象的引用,這樣我們可以在運行時動態地調用 speak
方法。
trait Animal {
fn speak(&self);
}
struct Dog;
impl Animal for Dog {
fn speak(&self) {
println!("Woof!");
}
}
struct Cat;
impl Animal for Cat {
fn speak(&self) {
println!("Meow!");
}
}
fn make_animal_speak<T: Animal>(animal: &T) {
animal.speak();
}
fn main() {
let dog = Dog;
let cat = Cat;
make_animal_speak(&dog); // 輸出 "Woof!"
make_animal_speak(&cat); // 輸出 "Meow!"
}
在這個例子中,我們定義了一個泛型函數 make_animal_speak
,它接受一個實現了 Animal
特征的泛型類型 T
的引用。通過在泛型類型上添加特性約束 T: Animal
,我們可以確保編譯器在編譯時檢查類型 T
是否實現了 Animal
特征,并根據實際類型調用相應的 speak
方法實現。
總之,Rust 通過特征對象和泛型特性約束實現了類似多態的功能,但它們與傳統的面向對象編程中的多態有所不同。