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