Руководство для начинающих - краткое введение в Struct, Impl и Traits
OOPS
Объектно-ориентированное программирование (OOPS) - действительно популярная парадигма программирования, основанная на классах и объектах. Объекты экземпляры классов и используются для представления реальных сущностей. Каждый объект содержит набор атрибутов, которые представляют собой данные, которые содержат состояние объекта, и поведения, которые представляют собой методы, которые манипулируют данными для получения значимых результатов. Классы - это схема для создания объектов.
Объектно-ориентированное программирование основано на четырех основных принципах:
- Наследование
- Инкапсуляция
- Абстракция
- Полиморфизм
Учитывая популярность OOPS, для большинства было бы неожиданностью, что у нас нет четкого консенсуса среди программистов по функциям, необходимым для определения, является ли язык объектно-ориентированным или нет. Rust является многопарадигмальным языком и поддерживает поддержку облегченных версий Oops, таких как это современный Go. Но это далеко не так мощно, как java и python.
Сначала мы обсудим, как имитировать классы и создавать объекты в ржавчине. Мы пройдем через:
- Struct
- Черты
- Impl
1. Struct
Rust поддерживает oops через structs
вместо традиционных классов. Struct - это определенные пользователем типы, которые хранят атрибуты / состояние объекта. Rust не является строго объектно-ориентированным, как Java
и C++
.
Мы можем получить доступ к атрибутам, создав экземпляры структур:
2. Черты характера
Traits
содержит только поведение / методы объекта. Черты аналогичны интерфейсу в других языках программирования. Совместное поведение абстрагируется от черт.
Здесь мы определили Formula
черты с get_area
и get_perimeter
функциями. Мы также можем реализовать метод struct, используя impl <trait> for <struct>
.
3. Impl
Как видно из предыдущего примера, Impl
используется для добавления метода в структуру.
В приведенном выше примере мы добавили new()
в качестве конструктора в структуру цилиндра, а также функцию get_summary()
, которая просто печатает площадь и периметр. Теперь давайте посмотрим, как мы можем получить доступ к функциям.
Во многих ситуациях let cylinder = Cylinder{radius: 1.0, height: 2.0, unit: “cm”.to_string()};
более подробный и простой для понимания, чем let cylinder = Cylinder::new(1.0, 2.0);
. Но метод new()
может сделать вещи удобными для нас, если мы хотим присвоить структуре значение по умолчанию. Поэтому, если все поля являются общедоступными, лучше не использовать struct. В противном случае, если даже одно поле является закрытым, необходимо использовать new()
в качестве конструктора.
Теперь, когда мы определили, как добавлять атрибуты и методы, мы рассмотрим основные принципы oops:
1. Наследование
Наследование - это отношение есть между двумя классами. Это обеспечивает возможность повторного использования кода и безопасность типов. Люди больше не предпочитают наследство. Таким образом, большинство людей не уснут, зная, что ржавчина не поддерживает наследование. Вместо этого Rust продвигает композицию выше наследования. Считается лучше использовать и внедрить. Для реализации отношения (композиции) есть ржавчина использует трейты.
2. Инкапсуляция
Инкапсуляция - это способ ограничения деталей реализации объекта кодом, который использует этот объект. Это также известно как сокрытие данных. Чтобы предоставить доступ извне к файлам, мы можем указать pub
в качестве ключевого слова для установки параметра public. По умолчанию все, что не имеет префикса pub
, является приватным.
В приведенном выше коде мы сделали структуру общедоступной, но атрибуты структуры Cylinder - радиус, высота и единица измерения - частные. Если мы попытаемся получить доступ к атрибуту в другом файле, мы получим жалобы от компилятора.
Мы реализуем методы установки и получения, которые предоставляют доступ для чтения и записи к атрибуту. В приведенном ниже коде get_unit()
- это средство получения, а set_unit()
- средство установки.
3. Абстракция
Абстракция помогает нам писать реализацию, скрывая ненужную информацию, такую как частные атрибуты. В другом примере мы использовали абстракцию. Как и в get_area()
, мы возвращаем область, используя частные переменные radius
и height
.
4. Полиморфизм
Полиморфизм - это способность, которая позволяет использовать единый интерфейс для нескольких типов. Он в основном используется при повторном использовании кода.
Мы изменили структуру и трейты из последнего примера и свели их к минимуму, чтобы удалить стандартные коды. Здесь у нас есть черта get_area()
, которая реализована в структурах Cylinder
и Triangle
. Когда мы используем функцию, основанную на структуре, у нас есть другой метод расчета и другой результат.