История изменений
Исправление FishHook, (текущая версия) :
те самые трейты, предоставляющие полиморфизм, но не настолько мощный, как в C++/Java/Eiffel
В расте, если я все правильно понимаю, всё нормально с динамическим полиморфизмом:
fn dynamic_dispatch(p: &dyn Printer) {
p.print();
}
по-моему, ничем принципиально не отличается от виртуальных методов С++, ТВМы устроены немного по-другому, синтаксис другой, ну а по сути тоже самое.
Поэтому какой-то ООП в Rust есть.
Да самый настоящий ООП. Непривычный просто. Наследование? В расте есть более мощная штука, можно имплементировать дефолтное поведение для трейта, и специфицировать дефолт для конкретной реализации, в принципе тоже наследование
struct Point {
x: i32,
y: i32
}
struct Square {
left_up: Point,
right_bottom: Point
}
struct Triangle {
a: Point,
b: Point,
c: Point,
}
fn distance(a: &Point, b: &Point) -> f64 {
(((a.x - b.x ).pow(2) + (a.y - b.y).pow(2)) as f64).sqrt()
}
trait Polygon {
fn get_lines(&self) -> Vec<(Point, Point)>;
fn perimetr(&self) -> f64 {
self.get_lines().into_iter().map(|l| distance(&l.0, &l.1)).sum()
}
}
impl Polygon for Square {
fn get_lines(&self) -> Vec<(Point, Point)> {
...
}
}
impl Polygon for Triangle {
fn get_lines(&self) -> Vec<(Point, Point)> {
...
}
}
Исходная версия FishHook, :
те самые трейты, предоставляющие полиморфизм, но не настолько мощный, как в C++/Java/Eiffel
В расте, если я все правильно понимаю, всё нормально с динамическим полиморфизмом:
fn dynamic_dispatch(p: &dyn Printer) {
p.print();
}
по-моему, ничем принципиально не отличается от виртуальных методов С++, ТВМы устроены немного по-другому, синтаксис другой, ну а по сути тоже самое.
Поэтому какой-то ООП в Rust есть. Да самый настоящий ООП. Непривычный просто. Наследование? В расте есть более мощная штука, можно имплементировать дефолтное поведение для трейта, и специфицировать дефолт для конкретной реализации, в принципе тоже наследование
struct Point {
x: i32,
y: i32
}
struct Square {
left_up: Point,
right_bottom: Point
}
struct Triangle {
a: Point,
b: Point,
c: Point,
}
fn distance(a: &Point, b: &Point) -> f64 {
(((a.x - b.x ).pow(2) + (a.y - b.y).pow(2)) as f64).sqrt()
}
trait Polygon {
fn get_lines(&self) -> Vec<(Point, Point)>;
fn perimetr(&self) -> f64 {
self.get_lines().into_iter().map(|l| distance(&l.0, &l.1)).sum()
}
}
impl Polygon for Square {
fn get_lines(&self) -> Vec<(Point, Point)> {
...
}
}
impl Polygon for Triangle {
fn get_lines(&self) -> Vec<(Point, Point)> {
...
}
}