Прямые ссылки на публичные уроки для быстрого старта и стабильной индексации lesson-страниц.
На протяжении всего обучения мы оперировали переменными разных типов — базовых (Int, Boolean) и более сложных (Array, LongRange, IntProgression).
Все эти типы представляют собой классы, содержащие функции и свойства, которые мы используем для работы с данными.
Вспомним пример из 8 урока: при выводе пронумерованного списка ингредиентов мы вызывали indexOf() на массиве:
arrayOfIngredients.indexOf(i)
Массив arrayOfIngredients имеет тип Array (он же класс Array), внутри которого и определена функция indexOf(). Таким образом, классы — это шаблоны, в которых определяются свойства и функции для определённых сценариев программы.
Мы можем создавать собственные классы с любой нужной логикой. Это основа объектно-ориентированного программирования (ООП) — подхода, при котором разработчик мыслит объектами реального мира. Это существенно облегчает разработку, поддержку и масштабирование программ.
Алгоритм работы с ООП:
Представим, что мы проектируем приложение с рецептами: список блюд по категориям, инструкция по приготовлению, добавление в избранное, отправка контактам.
Из описания выделяем основную сущность — блюдо. Создадим для неё класс.
Создадим пакет lesson_11. Файл класса принято называть так же, как и класс, а сами классы — всегда с заглавной буквы. Нажимаем ПКМ на пакет → New → Kotlin Class/File (или File) → вводим название Dish.
В начале файла появится строка package lesson_11, указывающая компилятору на принадлежность файла к пакету.
Объявление класса — ключевое слово class, затем название и фигурные скобки (тело класса):
class Dish { }
Свойства перечисляются в круглых скобках после названия класса через запятую. Объявляются как переменные с обязательным указанием типа.
У блюда определим следующие поля:
id — числовой идентификатор (уникален в базе)name — строка с названием блюдаcategory — строка с категориейingredients — список строк с ингредиентамиinFavorites — булево значение, добавлено ли блюдо в избранноеХорошей практикой является оставлять запятую после последнего свойства (trailing comma). Это позволяет добавлять новые свойства без правки предыдущих строк.
Если нужно задать значение по умолчанию, оно указывается прямо в объявлении свойства. Поскольку при создании объект не должен находиться в избранном, inFavorites инициализируем значением false:
class Dish( val id: Int, val name: String, val category: String, val ingredients: List<String>, val inFavorites: Boolean = false, ) { }
Класс — это чертёж (шаблон). На его основе создаются конкретные объекты (экземпляры класса) с уникальными значениями свойств.
В пакете урока создадим файл Main с функцией main() и объявим в ней два объекта класса Dish. Тип переменной — это и есть имя класса:
fun main() { val dish1: Dish = Dish( id = 1, name = "Яичница", category = "Завтраки", ingredients = listOf("яйцо", "помидор", "соль", "перец"), ) val dish2: Dish = Dish( id = 2, name = "Суп лапша", category = "Обеды", ingredients = listOf("вода", "курица", "вермишель", "соль", "перец"), ) }
Подробнее о конструкторах: https://kotlinlang.org/docs/classes.html#constructors
Свойства читаются через точку:
println(dish1.name) println(dish1.ingredients) println(dish1.inFavorites)
Для изменения свойства переменная объявляется через var. Тогда можно присвоить новое значение:
dish1.category = "Блюда из яиц" dish2.inFavorites = true println(dish1.category) println(dish2.inFavorites)
Помимо свойств, класс может содержать методы — функции, доступные всем объектам этого класса. Это позволяет переиспользовать логику вместо копирования кода для каждого объекта.
Добавим в класс Dish четыре метода:
fun addToFavorites() { println("Блюдо $name добавлено в избранное") inFavorites = true } fun removeFromFavorites() { println("Блюдо $name удалено из избранного") inFavorites = false } fun startCooking() { println("Пользователь перешел на экран начала приготовления блюда $name") } fun downloadIngredients(): List<String> { return ingredients }
Внутри методов переменная name автоматически подставляет значение того объекта, для которого вызван метод.
Вызовем методы для демонстрации пользовательских сценариев:
println("Действия для блюда Яичница") dish1.addToFavorites() println(dish1.inFavorites) dish1.startCooking() println() println("Действия для блюда Куриный суп") dish2.addToFavorites() println(dish2.inFavorites) val ingredientsForSoup = dish2.downloadIngredients() println(ingredientsForSoup) dish2.removeFromFavorites() println(dish2.inFavorites)
После запуска консоль покажет корректную работу всех методов. Цель примера — показать, что методы, объявленные один раз в классе, можно переиспользовать для любого количества объектов.