Rust オブジェクト指向
オブジェクト指向のプログラミング言語は通常、データのカプセル化と継承を実装し、データに基づいてメソッドを呼び出すことができます。
Rust はオブジェクト指向のプログラミング言語ではありませんが、これらの機能はすべて実現されています。
カプセル化
カプセル化とは外部に対する表示の戦略であり、Rust ではモジュールの仕組みによって最外部のカプセル化を実現できます。また、各 Rust ファイルは1つのモジュールと見なすことができ、モジュール内の要素は pub キーワードによって外部に明示できます。この点については「組織管理」の章で詳しく説明しました。
「クラス」は、オブジェクト指向のプログラミング言語でよく使われる概念です。「クラス」がカプセル化するのはデータであり、同じ種類のデータ実体とその処理方法の抽象化です。Rust では、構造体または列挙型を使用してクラスの機能を実装できます:
インスタンス
pub field: Type,
}
pub impl ClassName {
fn some_method(&self) {
// メソッド関数本体
}
}
pub enum EnumName {
A,
B,
}
pub impl EnumName {
fn some_method(&self) {
}
}
次に完全なクラスを構築します:
インスタンス
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();
}
出力結果:
from public method from private method
継承
他のほとんどすべてのオブジェクト指向プログラミング言語は「継承」を実装でき、この動作を「extend」という言葉で表現します。
継承は多態性(Polymorphism)の考え方の実装であり、多態性とはプログラミング言語が複数の型のデータを処理できるコードを指します。Rust では、トレイト(trait)によって多態性を実装します。トレイトの詳細については「トレイト」の章で説明しています。ただし、トレイトは属性の継承を実装できず、「インターフェース」に似た機能しか実装できないため、クラスのメソッドを継承したい場合は「子クラス」で「親クラス」のインスタンスを定義するのが最善です。
まとめると、Rust は継承に関する構文糖衣を提供しておらず、公式の継承手段(Java のクラス継承と完全に同等のもの)もありませんが、柔軟な構文によって関連する機能を実現できます。
その他の拡張