Наследование, классы и объекты

Обучение дротикам [Часть 3]

Краткий и быстрый способ ознакомления с концепциями Dart Inheritance, Classes, Objects и OOPs.

Добро пожаловать обратно в четкое и краткое руководство по изучению Dart. Этот пост будет охватывать расширенные темы Dart, такие как наследование, классы, объекты и другие концепции объектно-ориентированного программирования (ООП). Если вы еще не изучили Основы Dart или Промежуточные концепции, то бегло ознакомьтесь с ними, прежде чем продолжить эту публикацию.

Примечание. Этот пост немного длиннее по сравнению с моими предыдущими руководствами по Dart, каждое из которых длится почти 10 минут чтения. Так что подождите немного, поверьте мне, как только вы закончите с этим сообщением, вы почти закончите с языком Dart. Этот пост также очень важен для изучения Flutter. Если вы здесь, чтобы прочитать подробную версию, убедитесь, что после того, как вы закончите с подробной версией, вы пройдете через TL; раздел для быстрого резюме. Кроме того, я настоятельно рекомендую вам также использовать дартпад для выполнения того, что вы узнаете здесь сегодня. Не торопитесь и медленно усваивайте концепции.

К настоящему времени вы, должно быть, уже хорошо знаете, что я любитель раздела TLDR; любого учебного пособия, поэтому давайте быстро рассмотрим то, что мы узнаем подробно в следующих разделах.

Уровень обучения: ★★★ ☆☆ (продвинутый)

Вы можете использовать дротик для запуска дротиков онлайн.

TL; DR;

Если вы хотите прочитать подробную версию, вы можете перейти к этому разделу.

Если вы уже немного знакомы с жаргоном дротиков или уже знаете Java, Python или JavaScript, тогда вы можете быстро взглянуть на синтаксическую структуру и перейти к 4-му посту.

[Вы можете выполнить приведенный выше код здесь.]

Ура !!… Поздравляю !! 🥳🎉.

Теперь вы готовы глубоко погрузиться в Flutter. Вы можете перейти к следующему посту и изучить следующий набор материалов продвинутого уровня о Dart.

Полная версия…

Dart - объектно-ориентированный язык программирования. В Dart очень легко создавать классы и объекты и управлять ими, так что он может очень легко выступать в качестве замены Java.

  • Классы. Основой любого объектно-ориентированного языка программирования является класс. Класс можно назвать скелетом похожих объектов, так что объекты, принадлежащие к одному классу, ведут себя одинаково и обладают теми же качествами, что и друг друга. Класс определяет переменные и методы, которые объект может использовать для выполнения работы.
    Примечание. Классы не содержат никакой реальной информации. Они просто определяют структуру похожих объектов. Мы никогда не должны помещать информацию об объектах в класс.
    Основные примеры Class: Human (объектом может быть человек), Cat (объекты также могут быть настоящим домашним животным, например Kasper, Lilly и т. Д.).
    Примечание. Имя класса всегда начинается с заглавной буквы, а имена методов, переменных и объектов - с строчной буквы.
    Классы также можно объявить частными, начав имя с символа подчеркивания '_'. Этот класс будет виден только классам в том же файле.
  • Объекты: объекты - это экземпляры класса. Они содержат фактические данные и находятся в памяти. По своей основной структуре они придерживаются определенного класса. Dart позволяет создавать объекты несколькими способами. Иногда очень сложно использовать ключевое слово new, например, в Java (поскольку JavaScript позволяет создавать объекты даже без ключевого слова new). Таким образом, Dart позволяет пользователям пропускать ключевое слово new и создавать объекты, просто вызывая конструктор.
  • Конструкторы: это особый вид методов, которые не имеют возвращаемого типа и имеют то же имя, что и класс. Конструктор - это первый метод, вызываемый при создании объекта класса. Его основная задача - инициализировать переменные внутри объекта определенным значением по умолчанию, чтобы они не были нулевыми при инициализации объекта. Конструкторы могут быть параметризованными или непараметрическими. Они также могут принимать необязательные и именованные параметры.
  • Геттеры и сеттеры по умолчанию: Dart предоставляет методы получения и установки по умолчанию для общедоступных переменных, определенных в классе. Нам не нужно явно определять их, как в случае с Java. Мы можем напрямую использовать имя объекта, за которым следует точка «.», А затем имя переменной для доступа к переменной.
  • это ключевое слово: ключевое слово this используется внутри определения класса для указания на экземпляр объекта. Это то же самое, что и в Java, JavaScript, C ++, C # и «self» в Python.
  • Конструкторы по умолчанию: Dart предоставляет конструктор по умолчанию с 0 параметрами, если программист не упоминает конструктор. Этот конструктор мало что делает, но он необходим для создания конструктора по умолчанию, если мы намереваемся унаследовать этот класс.
  • Именованные конструкторы. Как упоминалось ранее, Dart не допускает перегрузки методов. И поскольку конструкторы также похожи на методы, нам предоставляются другие способы перегрузки конструкторов, помимо необязательных и именованных параметров. Один из способов называется именованными конструкторами. В этом случае мы можем назвать конструктор по своему выбору и использовать его при создании объекта.
  • Конструкторы перенаправления. В этой части мы узнаем, что именованный конструктор может вызывать существующий конструктор, но единственное, что здесь следует отметить, это то, что конструктор перенаправления не может иметь тела. По сравнению с Java, мы можем легко вызывать другие конструкторы внутри 1 конструктора с использованием this(), а также присваивать ему тело, но в Dart это не так.
  • Вызываемые классы: мы можем реализовать метод call(), а позже использовать объект этого класса как функцию.
  • Наследование. Одним из основных понятий ООП и использования классов является наследование. Благодаря этому мы можем многократно использовать коды в очень большой степени, а также обеспечивать иерархию классов, чтобы придать им лучшее значение.
    Например: Млекопитающие могут быть «суперклассом» и могут быть унаследованы людьми и животными. классы. Кроме того, такие классы, как Cat и Dog, могут наследовать класс Animal.
    Dart допускает 2 типа наследования: с использованием ключевого слова extends и с использованием ключевого слова implements. Дочерний класс, наследующий родительский класс, получает в нем копию полного каркаса. Таким образом, нам не нужно заново определять каркас дочернего класса, если его каркас совпадает с родительским классом. Это очень полезно в сценариях, когда дочерний класс отличается от родительского только в некоторых ситуациях. Например: метод «колеса» в «Транспортные средства» может быть определен для использования 4 колес, а когда он реализован классом «Рикша», его можно заменить на метод «колеса», в то время как остальная часть определения остается прежней.
  • Переопределение методов родительского класса: когда класс наследует родительский класс, подкласс (также известный как дочерний класс) может изменить реализацию метода родительского класса, переопределив его. Мы используем аннотацию @overrides перед определением метода, а затем повторно реализуем его. Таким образом, у дочернего класса может быть другой вариант одного и того же метода. В приведенном выше примере класс Rickshaw может переопределять метод «wheel» и может возвращать 3 вместо 4, как определено родительским классом.
  • ключевое слово super: ключевое слово super можно использовать для доступа к методам и конструкторам родительского класса в дочернем классе. Если конструктор использует ключевое слово super для перенаправления на родительский конструктор, он все еще может иметь тело для выполнения другой инициализации, что не относится к перенаправляющим конструкторам.
  • Расширяет наследование: это основной тип наследования. Приведенные выше примеры демонстрируют такой тип наследования. Здесь все определение родительского класса наследуется дочерним классом. Здесь только дочерний класс может наследовать только один родительский класс.
  • Реализует наследование: это наследование подструктуры. Здесь наследуется только структура родительского класса, а определение должно быть предоставлено дочерним для всех методов. Посредством этого наследования дочерний класс может наследовать из нескольких источников, что также называется множественным наследованием.
    - Интересный факт: множественное наследование было большой проблемой и недостатком C ++, где дочерний класс расширяет несколько классов. Это вызывало проблему, если в 2 или более классах был один и тот же метод, но с другим определением, возникала путаница относительно того, какое определение метода будет использоваться дочерним классом. Позже это было решено в Java путем введения ключевых слов interface и implements. Эта же концепция используется и в Dart.
  • Интерфейсы: указанное выше наследование применяется только к интерфейсам. Но нам не нужно беспокоиться об этом в Dart, поскольку и интерфейсы, и классы определены в Dart одинаково. По сути, каждый класс, когда он определен, также определяет интерфейс с тем же именем. Таким образом, легко реализовать интерфейс в Dart, просто используя ключевое слово implements. Здесь дочерний класс может реализовывать несколько родительских интерфейсов.
    Примечание. Если используется ключевое слово implements, то нам необходимо определить все методы и переменные, присутствующие во всех родительских классах.
  • Абстрактные классы: это то же самое, что и абстрактный класс в Java. Здесь мы можем частично определить класс, т.е. мы можем определить некоторые методы и оставить некоторые методы неопределенными. Таким образом, мы можем заставить дочерний класс определять свою собственную реализацию этих частичных методов. Мы не можем создавать объекты абстрактных классов. Они используются только для определения иерархической структуры наследования. Мы делаем класс абстрактным, добавляя ключевое слово abstract в начало определения класса.
  • Generic Class: это то же самое, что и в Java и C ++. Здесь мы можем определить класс как универсальный, чтобы при создании экземпляра объекта этого класса мы могли указать тип данных, чтобы объект вел себя так, как если бы класс был определен для самого этого типа данных. Например: класс стека можно сделать универсальным, так что нам не нужно определять отдельные классы стека для int, double, string или других типов данных. Мы можем просто создать экземпляр объекта и указать тип данных во время создания экземпляра, чтобы класс стека вел себя соответствующим образом.

Ура !!… Поздравляю !! 🥳🎉.

Теперь вы узнали о концепциях ООП в Dart, и теперь ваш уровень навыка Dart повысился. И теперь вы можете начать свой путь через Flutter.

Давайте пополним этот счетчик, продолжив обучение в этом следующем посте.

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