Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ООП на Rust, на примере 
:(
    Опции темы
Majestio
Дата 10.3.2018, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 19.12.2010

Репутация: нет
Всего: нет



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

Решил ознакомится с 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 реализовать абстрактный класс, виртуальный метод, и как работать с перекрытием методов?
PM MAIL WWW   Вверх
Majestio
Дата 11.3.2018, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 19.12.2010

Репутация: нет
Всего: нет



Кому будет интересно - вот одно из решений:

Код

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

PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Добро пожаловать в раздел "Другие языки" форума Vingrad!

Void
Void

Раздел посвящён различным языкам программирования, для которых (в силу невысокой популярности) нет отдельного раздела (GPSS, Lua, MATLAB, Ada, Forth, Smalltalk, Tcl, REXX, AWK и др.)

  • Обязательно следуйте правилам Форума.
  • Пожалуйста, прочитайте и следуйте рекомендациям по работе в разделе и навигации по Форуму.
  • Для вставки текстов исходных кодов используйте подсветку синтаксиса из выплывающего списка Код в форме ответа. Если Ваш язык в списке не представлен, то используйте тег: [code=ваш_язык]код[/code], например, [code=ada]код[/code]. Если в будущем подсветка синтаксиса для указанного языка будет реализована, исходный код преобразится.
  • Помните, один вопрос - одна тема.

Приятного времяпрепровождения! С уважением, Void, kemiisto .

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Другие языки | Следующая тема »


 




[ Время генерации скрипта: 0.0985 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.