Объектно-ориентированное программирование на Rust

Объектно-ориентированные языки программирования обычно реализуют инкапсуляцию данных и наследование, а также могут вызывать методы на основе данных.

Rust не является объектно-ориентированным языком программирования, но все эти возможности в нём реализованы.

Инкапсуляция

Инкапсуляция — это стратегия внешнего раскрытия. В Rust внешний уровень инкапсуляции можно реализовать через механизм модулей, и каждый файл Rust можно рассматривать как модуль. Элементы внутри модуля можно сделать видимыми извне с помощью ключевого слова `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 {
    поле: i32,
}

impl ClassName {
    pub fn new(value: i32) -> ClassName {
        ClassName {
            field: value
        }
    }

    pub fn public_method(&self) {
        println!("из публичного метода");
        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» для описания этого действия.

Наследование — это реализация концепции полиморфизма. Полиморфизм относится к коду на языке программирования, который может обрабатывать несколько типов данных. В Rust полиморфизм реализуется через трейты. Подробности о трейтах приведены в главе «Трейты». Однако трейты не могут реализовать наследование свойств; они могут реализовать только функциональность, подобную «интерфейсам». Поэтому, если вы хотите унаследовать методы класса, лучше всего определить экземпляр «родительского класса» внутри «подкласса».

В итоге, Rust не предоставляет синтаксический сахар, связанный с наследованием, и не имеет официального механизма наследования (полностью эквивалентного наследованию классов в Java), но его гибкий синтаксис всё ещё может реализовать соответствующую функциональность.

Другие расширения