- Документация
- Основы Dart 2.x
- Основы Dart 2.x (Классы и объекты) Часть II
За последние 30 дней: 29 просмотров, 18 посетителей.
Основы Dart 2.x (Классы и объекты) Часть II
Наследование
- Наследование является одним из фундаментальных атрибутов объектно-ориентированного программирования. Оно позволяет определить дочерний класс, который использует (наследует), расширяет или изменяет возможности родительского класса. Класс, члены которого наследуются, называется базовым классом. Класс, который наследует члены базового класса, называется производным классом.
Dart поддерживают только одиночное наследование. Это означает, что каждый класс может наследовать члены только одного класса. Но зато поддерживается транзитивное наследование, которое позволяет определить иерархию наследования для набора типов. Другими словами, тип "Camry" может наследовать возможности типа "Toyota", который в свою очередь наследует от типа "Car", который наследует от базового класса "Manufacture". Благодаря транзитивности наследования члены типа "Manufacture" будут доступны для типа "Camry". - Важное дополнение : Производные классы не наследуют конструкторы от родительских классов. Производный класс, у которого не объявлены конструкторы имеет только один стандартный конструктор.
В языке Dart наследование реализуется с помощью ключевого слова extends.
Пример:
- То есть понятно, что мы имеем доступ к полям и методам класса от которого наследуемся через объект нашего класса.
- Для доступа к функциональности базового класса из производного применяется ключевое слово super .
Dart не поддерживает множественное наследование как например С++, для того что бы избежать многих проблем связвнных с этим, например совпадение имен переменных и методов у предков класса и неоднозначности пути наследования в случае более чем двухуровневой иерархии. Но как альтернатива множественному наследованию в Dart выступают интерфейсы и миксины .
Интерфейсы
- Интерфейсы не содержат какой-либо реализации, но обеспечивают общий тип всем имплементациям (реализациям) всем дочерним классам. Для интерфейсов в Dart нет отдельного ключевого слова, это обычный класс, как правило - абстрактный.
Наследуется интерфейс ключевым словом implements.
- Мы также можем наследоватся от множества интерфейсов:
Примеси (mixins) - вместо описания типа, сигнатур методов наследуется непосредственно функционал класса. Ключевое слово для "примешивания" - with. Примеси существуют в Ruby, Python, Scala.
Более подробно и на рабочем примере написано здесь
Полиморфизм
- Сам термин полиморфизм можно перевести как «много форм». А если говорить проcтыми словами, полиморфизм – это различная реализация однотипных действий. Классическая фраза, которая коротко объясняет полиморфизм – «Один интерфейс, множество реализаций».
Как реализуется полиморфизм в Dart : - Абстрактный метод – это метод, который должен быть реализован в классе-наследнике. При этом, абстрактный метод не может иметь своей реализации в базовом классе (тело пустое).
- Переопределение метода – это изменение реализации метода, в классе наследнике метод будет работать отлично от базового класса.
В других языках таких как например C# переопределять можно только виртуальные методы.
В Dart производные классы могут переопределять (изменять) поведение методов базового класса. Для этого применяется аннотация @override :
- Важное дополнение : число и тип параметров метода должны совпадать при переопределении. В случае несоответствия в количестве параметров или типе данных, компилятор Dart выдаст ошибку.
Абстрактный метод определяется также, как и обычный, только вместо тела метода после списка параметров идет точка с запятой:
- абстрактные методы могут быть определены только в абстрактных классах. Кроме того, если базовый класс определяет абстрактный метод, то класс-наследник обязательно должен его реализовать, то есть определить тело метода.
Инкапсуляция
Инкапсуляция — свойство языка программирования, позволяющее пользователю не задумываться о сложности реализации используемого программного компонента (что у него внутри), а взаимодействовать с ним посредством предоставляемого интерфейса (публичных методов и членов), а также объединить и защитить жизненно важные для компонента данные с помощью спецификаторов доступа private, protected, internal - Но в Dart спецификаторов доступа как таковых нет, а приватные поля класса начинается с подчеркивания "_", но инкапсуляция реализуется с помощью геттеров и сеттеров.
Getters и Setters
- Геттеры и сеттеры — это специальные методы, которые обеспечивают доступ для чтения и записи свойств объекта. Напомним, что каждая переменная класса определяет геттер, и (если это возможно) — сеттер. Вы можете создать дополнительные свойства для реализации геттеров и сеттеров, используя ключевые слова get и set:
Геттеры и сеттеры применяются во многих языках программирования (C++/C#/Java/Ruby)
Подборка заметок