Найти тему
KOTLIN_IT

Урок №59 по Котлин. Классы

Оглавление

В Kotlin программу можно представить в виде взаимодействующих между собой объектов.

Представлением объекта является класс. Класс фактически представляет определение объекта. Например, у всех есть некоторое представление о машине, например, кузов, четыре колеса, руль и т.д. - некоторый общий набор характеристик, присущих каждой машине. Это представление фактически и является классом.

Для создания нового класса необходимо нажать правой кнопкой мыши на пакет, выбрать New и выбрать Kotlin Class/File и пропишем имя класса.

-2

Итак, в названии файла напишем Dish – блюдо.

-3

Теперь подумаем о свойствах или характеристиках этого блюда.

В случае блюд это могут быть уникальные названия, ингредиенты и так далее. Свойства можно перечислить в круглых скобках, открытых после названия класса, разделяя запятыми. Объявляются они как переменные без инициализации – то есть тип указывается обязательно.

Итак, у блюда могут быть такие поля, создадим их:

-4
  • id – предположим, что наши блюда хранятся в базе, чтобы отличать их друг от друга введем id — идентификатор. Он будет иметь числовое значение, что гарантированно предотвратит вероятность повторений в базе.
  • name – строка с названием блюда
  • category - строка с категорией блюда
  • ingredients – строковый список с ингредиентами
  • inFav – булеан значение, флаг означает добавлено ли какое то блюдо в избранное

При создании объекта (или экземпляра класса) нам необходимо будет указывать все перечисленные поля.

Однако, есть случаи, когда нужно сразу проставить значение по умолчанию. В данном случае все будущие объекты при создании не будут находиться в избранном, поэтому поле inFav проинициализируем значением false.

Мы создали класс и наделили его свойствами.

Класс Dish мы пока трогать не будем, а продолжим работу в другом месте, это будет Main.

В нем создадим функцию main()

-5
  • Создаем переменную dish1 и через равно пишем название созданного ранее класса Dish.
  • Открываем круглые скобки, в которых и будем прописывать свойства конкретного блюда, среда разработки уже подсвечивает их точно также, как мы заполняли параметрами функцию. Для красоты кода будем их записывать в столбик, явно обозначив названия свойств.
  • Для поля ингредиенты создаем список и тут же заполняем его. Поле isFavorites здесь заполнять уже не обязательно, для него мы указали значение по умолчанию false, и теперь все объекты будут хранить в себе это значение сразу.
-6

Теперь с этими объектами можно немного повзаимодействовать. Самое простое это, например, можно читать свойства.

Обращаться к свойствам нужно через точку.

-7

Распечатаем информацию на экран.

-8

Свойства можно изменять, присваивая новые значения. При этом переменная должна стать изменяемой (среда разработки предложит изменить val на var)

-9

Мы поменяли поле категории блюда.

Получим такой вывод:

-10

Как мы видим категория изменилась.

Создание функций внутри класса

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

Подумаем, какой функционал должен быть у сущности “Блюдо”.

  • Например, у нас есть поле inFav, что подразумевает добавление блюда в избранное. Также пользователь может совершить обратное действие – удаление из избранного.
  • Далее функционал приложения может подразумевать действие “Начать готовку”, которое перенесет пользователя на экран с процессом приготовления, в котором будут красиво расписаны шаги. Это значит, что для этого действия также нужен отдельный метод.
  • И, наконец, добавим такое действие, как “Скачать список покупок” – в нем будет возвращаться список ингредиентов.

Давайте перечислим эти функции в классе Dish().

-11
  1. Наполнять методы будем консольными сообщениями для имитации запуска требуемого функционала.
  2. Для добавления/удаления из избранного будем распечатывать сообщение включающее название блюда и менять флаг inFav на true и наоборот.
  3. В строке пишем переменную name. В нее подставится конкретное значение в зависимости от объекта, для которого будет вызываться это действие.
  4. Метод startCooking() также будет сигнализировать текстовым сообщением.
  5. Метод downloadIngredients() пусть будет возвращать список ингредиентов для выбранного блюда для имитации его скачивания.

Обращение к методам класса

В классе Main.kt обратимся к ранее созданным функциям

-12
  • для начала объявим заголовок
  • добавили блюдо в избранное
  • далее перешли на экран приготовления выбранного блюда
  • пользователь решил скачать список с ингредиентами.
  • пользователь удалил блюдо из избранного

Выведем на экран и посмотрим что получилось:

-13

После запуска в консоли можно отследить работу всех методов.

Программа отработала корректно.

Целью примера было продемонстрировать логику работы функций в классе, к которым мы обращаемся через экземпляры класса.