Rust オブジェクト指向

オブジェクト指向のプログラミング言語は通常、データのカプセル化と継承を実装し、データに基づいてメソッドを呼び出すことができます。

Rust はオブジェクト指向のプログラミング言語ではありませんが、これらの機能はすべて実現されています。

カプセル化

カプセル化とは外部に対する表示の戦略であり、Rust ではモジュールの仕組みによって最外部のカプセル化を実現できます。また、各 Rust ファイルは1つのモジュールと見なすことができ、モジュール内の要素は pub キーワードによって外部に明示できます。この点については「組織管理」の章で詳しく説明しました。

「クラス」は、オブジェクト指向のプログラミング言語でよく使われる概念です。「クラス」がカプセル化するのはデータであり、同じ種類のデータ実体とその処理方法の抽象化です。Rust では、構造体または列挙型を使用してクラスの機能を実装できます:

インスタンス

pub struct ClassName {
    pub field: Type,
}

pub impl ClassName {
    fn some_method(&self) {
        // メソッド関数本体
    }
}

pub enum EnumName {
    A,
    B,
}

pub impl EnumName {
    fn some_method(&self) {

    }
}

次に完全なクラスを構築します:

インスタンス

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();
}

出力結果:

from public method
from private method

継承

他のほとんどすべてのオブジェクト指向プログラミング言語は「継承」を実装でき、この動作を「extend」という言葉で表現します。

継承は多態性(Polymorphism)の考え方の実装であり、多態性とはプログラミング言語が複数の型のデータを処理できるコードを指します。Rust では、トレイト(trait)によって多態性を実装します。トレイトの詳細については「トレイト」の章で説明しています。ただし、トレイトは属性の継承を実装できず、「インターフェース」に似た機能しか実装できないため、クラスのメソッドを継承したい場合は「子クラス」で「親クラス」のインスタンスを定義するのが最善です。

まとめると、Rust は継承に関する構文糖衣を提供しておらず、公式の継承手段(Java のクラス継承と完全に同等のもの)もありませんが、柔軟な構文によって関連する機能を実現できます。

その他の拡張