Rust的物件導向(四) 為結構體或列舉實現特性

2021-10-24 05:27:01 字數 2525 閱讀 8193

從2023年c語言主體完成到2023年c++正式命名,10年的時間,程式設計理念經歷了一次從面向過程到物件導向的蛻變。資料的組織形式也從struct到class得到了昇華。自那以後,幾乎所有語言的類都是class,相當一部分程式設計師知道怎麼用class卻不能準確說出來物件導向是什麼。然而,go和rust卻同時站出來說:「我們不需要class。」頓時,全場靜音。

事實上,物件導向的概念早在2023年的simula語言中就開始提出來了,比c語言的面世還早了6年。可是時至今日,全網也找不到乙個權威的物件導向的定義,有的都是用會意的方式來解釋什麼是物件導向。

相比物件導向抽象的定義而言,物件導向的三要素卻是非常具體的,它們是:

封裝很好理解,就是定義類的屬性和方法,並且提供訪問級別來控制其它類的物件是否可以訪問它們。rust雖然沒有類,但可以使用結構體或列舉來定義屬性,並為結構體或列舉附加方法來實現。

而繼承是類之間的關係,因為沒有類,rust和go都沒有繼承的概念。不過rust巧妙的用泛型以及泛型的特性實現了一套與繼承相類似的**共享機制。

多型是建立在繼承之上的,它允許在使用父類的地方使用子類,rust的特性也擁有類似的能力。

在學習rust的物件導向之前,需要充分意識到接下來要學習的東西與你之前認識的世界有著天壤之別,不要被過去的知識所束縛,退一步,進入乙個嶄新的世界。

學習rust的物件導向是乙個漫長的過程,裡面要掌握的知識非常多,我們可以使用下面的路線圖來學習rust的物件導向:

建立結構體或列舉

為結構體或列舉實現方法

為結構體或列舉實現特性

強調一點,rust是沒有繼承的,而編寫**的過程中,又經常會遇到許多不相同的型別有共同方法的情況,為了應對這種情況,rust使用了特性這個概念。特性是一組方法,用來定義某些事物共有的行為。

過去我們學習物件導向時,總是用各種動物都會走路作為例子,先定義乙個動物類,類中定義乙個走路方法,然後派生出各種動物。在rust中,就應該這麼考慮,動物有一些共同的特性如走路、如鳴叫等。

那麼如何定義特性呢?這個很簡單:

// 定義動物特性

trait animal

// 奔跑,在定義特性時直接實現

fn run(&self)

// 鳴叫,類似於抽象方法,不在特性中實現,需要在實現特性時實現

fn sing(&self);

}

使用trait關鍵字定義animal特性包括三個方法:

// 定義蝸牛結構體

struct snail

// 為蝸牛實現動物特性

impl animal for snail

// 實現sing方法

fn sing(&self)

}

為結構體實現特性與實現方法類似,都使用impl關鍵字,不同的是impl後接的不是結構體的名字,而是特性的名字,然後用for關鍵字指定結構體的名字。

在impl塊中,可以實現在特性中已經實現的方法,呼叫時impl中定義的方法生效。必須要實現特性中沒有實現的方法,如果不實現將無法通過編譯。

例項化結構體後,就可以像呼叫方法那樣呼叫特性中的方法:

fn main() ;

snail.walk(); // 呼叫特性中的walk方法

snail.run(); // 呼叫snail實現的run方法

snail.sing(); // 呼叫snail實現的sing方法

}

在程式執行時walk方法呼叫的特性中的方法,run和sing方法呼叫的都是結構體中實現的方法。

特性誕生的初衷就是為了**共享,因為,可以同時為多個結構體或列舉實現同一特性:

// 定義動物特性

trait animal

// 奔跑,在定義特性時直接實現

fn run(&self)

// 鳴叫,類似於抽象方法,不在特性中實現,需要在實現特性時實現

fn sing(&self);

}// 定義蝸牛結構體

struct snail

// 為蝸牛實現動物特性

impl animal for snail

// 實現sing方法

fn sing(&self)

}// 定義公牛結構體,還記得嗎,沒有屬性的結構體,被稱為類單元結構體

struct bill {}

// 為蝸牛實現動物特性

impl animal for bill

}fn main() ;

snail.walk(); // 呼叫特性中的walk方法

snail.run(); // 呼叫snail實現的run方法

snail.sing(); // 呼叫snail實現的sing方法

let bill = bill{};

bill.walk(); // 呼叫特性中的walk方法

bill.run(); // 呼叫特性中的run方法

bill.sing(); // 呼叫bill實現的sing方法

}

Rust的物件導向(一) 結構體

從1973年c語言主體完成到1983年c 正式命名,10年的時間,程式設計理念經歷了一次從面向過程到物件導向的蛻變。資料的組織形式也從struct到class得到了昇華。自那以後,幾乎所有語言的類都是class,相當一部分程式設計師知道怎麼用class卻不能準確說出來物件導向是什麼。然而,go和ru...

結構體或物件排序

經常碰到結構體排序的問題,在此總結一下。以乙個簡單的例題開始 例1 有三個人 person結構體 每個人都有name string型 和age int型 兩個屬性,現在需要按照下面的規則排序 先以姓名按從小到大排序 如abc include includeusing namespace std st...

Go 物件導向之結構體

說明 1.將一類事物的特性提取出來 比如貓類 形成乙個新的資料型別就是乙個結構體 2.通過這個結構體,可以建立多個變數 例項 物件 3.事物可以是貓類,也可以是其它的類.案例 package main import fmt 定義乙個結構體,類似於類 將cat 的各個字段 屬性,放入到結構體中 typ...