Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2018, 14:36   #1
Majestio
Пользователь
 
Аватар для Majestio
 
Регистрация: 12.07.2012
Сообщений: 65
По умолчанию ООП на Rust

Приветствую!

Решил ознакомится с Rust, но не заметил там "нативной" поддержки ООП. Тем не менее, конструкции языка позволяют применять инструментарий ООП. Нашел неплохую статью про это. Но увы, цельного примера я там не нашел, все расписывалось кусками. А хотелось бы в качестве резюме - полноценный пример.

Кому не лениво, и кто в теме, прошу составленный мною синтетический пример на C++ перевести на Rust:

Код:
#include <iostream>
#include <vector>

// *****************************************************************************

class Figure {
  public:
    virtual double Area() = 0;
    void PrintName() {
      std::cout << "Фигура = " << Name() << " ";
    }
  private:
    virtual std::string Name() = 0;
};

// *****************************************************************************

class Rectangle: public Figure {
  public:
    explicit Rectangle(double h, double w): H(h), W(w) {}
    double Area() override {
      return H*W;    	
    }
  private:
    double H,W;
    std::string Name() override {
      return "Прямоугольник";
    }
};

// *****************************************************************************

class Square: public Rectangle {
  public:
    explicit Square(double l): Rectangle (l,l) {}
  private:
    std::string Name() override {
      return "Квадрат";
    }
};

// *****************************************************************************

class Ellipse: public Rectangle {
  public:
    explicit Ellipse(double a, double b): Rectangle (a,b) {}
    double Area() override {
      return Rectangle::Area()*3.1415;    	
    }
  private:
    std::string Name() override {
      return "Эллипс";
    }
};

// *****************************************************************************

int main() {
  std::vector<Figure*> V;
  V.push_back(new Rectangle(2,3));
  V.push_back(new Square(4));
  V.push_back(new Ellipse(2,3));
  for(const auto &i:V) {
    i->PrintName();
    std::cout << ", площадь: " << i->Area() << std::endl;
    delete i;
  }
  return 0;
}
Пока не пойму, как в Rust реализовать абстрактный класс, виртуальный метод, и как работать с перекрытием методов?
Мои программные ништякиhttps://majestio.info
Majestio вне форума Ответить с цитированием
Старый 10.03.2018, 21:33   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от Majestio Посмотреть сообщение
не заметил там "нативной" поддержки ООП.
В чистом виде её там и нет.
Это Вы читали, конечно: https://rustycrate.ru/обучение/2017/...p-in-rust.html

Цитата:
Сообщение от Majestio Посмотреть сообщение
как в Rust реализовать абстрактный класс, виртуальный метод, и как работать с перекрытием методов?
Нет там таких конструкций. Есть trait, но это всё же не совсем оно
Black Fregat вне форума Ответить с цитированием
Старый 11.03.2018, 09:55   #3
Majestio
Пользователь
 
Аватар для Majestio
 
Регистрация: 12.07.2012
Сообщений: 65
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
В чистом виде её там и нет.
Это Вы читали, конечно: https://rustycrate.ru/обучение/2017/...p-in-rust.html
Да. Конечно. Эту ссылку я приводил с своем первом сообщении.

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Нет там таких конструкций. Есть trait, но это всё же не совсем оно
Понятно. На всякий случай привожу код-аналог на Rust, который мне показали на соседнем форуме:

Код:
    use std::io::stdin;
    use std::io::BufRead;
    use std::io::BufReader;
     
    mod figures {
     
        pub trait Figure {
            fn area(&self) -> f64;
            fn printName(&self) {
                print!("Figure = {} ", self.name());
            }
            fn name(&self) -> &'static str;
        }
     
        pub struct Rectangle {
            w: f64,
            h: f64,
        }
     
        impl Rectangle {
            pub fn new(width: f64, height: f64) -> Rectangle {
                Rectangle { w: width, h: height }
            }
        }
     
        impl Figure for Rectangle {
            fn name(&self) -> &'static str {
                "Rectangle"
            }
            fn area(&self) -> f64 {
                self.h * self.w
            }
        }
     
        pub struct Square {
            rectangle: Rectangle,
        }
     
        impl Square {
            pub fn new(size: f64) -> Square {
                Square { rectangle: Rectangle { w: size, h: size } }
            }
        }
     
        impl Figure for Square {
            fn name(&self) -> &'static str {
                "Square"
            }
            fn area(&self) -> f64 {
                self.rectangle.area()
            }
        }
     
        pub struct Ellipse {
            rectangle: Rectangle,
        }
     
        impl Ellipse {
            pub fn new(a: f64, b: f64) -> Ellipse {
                Ellipse { rectangle: Rectangle { w: a, h: b } }
            }
        }
     
        impl Figure for Ellipse {
            fn name(&self) -> &'static str {
                "Ellipse"
            }
            fn area(&self) -> f64 {
                self.rectangle.area() * 3.1415
            }
        }
    }
     
    fn main() {
        use figures::{Figure, Rectangle, Square, Ellipse};
        let v: [&Figure; 3] = [
            &Rectangle::new(2.0, 3.0),
            &Square::new(4.0),
            &Ellipse::new(2.0, 3.0)
            ];
        for i in v.iter() {
            i.printName();
            println!(", area: {}", i.area());
        }
    }
Мои программные ништякиhttps://majestio.info
Majestio вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна накрутка игроков на сервер rust. Sultan777 Фриланс 2 22.07.2018 13:08
Rust на linux ( ubuntu ) s88s Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 1 31.07.2017 20:16
чит для Rust Experemental АлексRose Фриланс 0 21.12.2015 19:58
Вопрос по игре RUST fok94 Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 13.08.2015 14:46