面向?qū)ο蟮木幊陶Z(yǔ)言通常實(shí)現(xiàn)了數(shù)據(jù)的封裝與繼承并能基于數(shù)據(jù)調(diào)用方法。
Rust 不是面向?qū)ο蟮木幊陶Z(yǔ)言,但這些功能都得以實(shí)現(xiàn)。
封裝就是對(duì)外顯示的策略,在 Rust 中可以通過(guò)模塊的機(jī)制來(lái)實(shí)現(xiàn)最外層的封裝,并且每一個(gè) Rust 文件都可以看作一個(gè)模塊,模塊內(nèi)的元素可以通過(guò) pub 關(guān)鍵字對(duì)外明示。這一點(diǎn)在"組織管理"章節(jié)詳細(xì)敘述過(guò)。
"類(lèi)"往往是面向?qū)ο蟮木幊陶Z(yǔ)言中常用到的概念。"類(lèi)"封裝的是數(shù)據(jù),是對(duì)同一類(lèi)數(shù)據(jù)實(shí)體以及其處理方法的抽象。在 Rust 中,我們可以使用結(jié)構(gòu)體或枚舉類(lèi)來(lái)實(shí)現(xiàn)類(lèi)的功能:
pub struct ClassName { pub field: Type, } pub impl ClassName { fn some_method(&self) { // 方法函數(shù)體 } } pub enum EnumName { A, B, } pub impl EnumName { fn some_method(&self) { } }
下面建造一個(gè)完整的類(lèi):
second.rs pub struct ClassName { field: i32, } impl ClassName { pub fn new(value: i32) -> ClassName { ClassName { field: value } } pub fn public_method(&self) { println!("from public method"); self.private_method(); } fn private_method(&self) { println!("from private method"); } } main.rs mod second; use second::ClassName; fn main() { let object = ClassName::new(1024); object.public_method(); }
輸出結(jié)果:
from public method from private method
幾乎其他的面向?qū)ο蟮木幊陶Z(yǔ)言都可以實(shí)現(xiàn)"繼承",并用"extend"詞語(yǔ)來(lái)描述這個(gè)動(dòng)作。
繼承是多態(tài)(Polymorphism)思想的實(shí)現(xiàn),多態(tài)指的是編程語(yǔ)言可以處理多種類(lèi)型數(shù)據(jù)的代碼。在 Rust 中,通過(guò)特性(trait)實(shí)現(xiàn)多態(tài)。有關(guān)特性的細(xì)節(jié)已在"特性"章節(jié)給出。但是特性無(wú)法實(shí)現(xiàn)屬性的繼承,只能實(shí)現(xiàn)類(lèi)似于"接口"的功能,所以想繼承一個(gè)類(lèi)的方法最好在"子類(lèi)"中定義"父類(lèi)"的示例。
總結(jié)地說(shuō),Rust 沒(méi)有提供跟繼承有關(guān)的語(yǔ)法糖,也沒(méi)有官方的繼承手段(完全等同于 Java 中的類(lèi)的繼承),但靈活的語(yǔ)法依然可以實(shí)現(xiàn)相關(guān)的功能。