Перейти к содержанию

🗒 Задача

Создай класс, описывающий заказ в интернет-магазине. В заказе должны быть номер заказа и статус готовности. Номер заказа должен быть недоступен для изменения.

Создай метод, который меняет статус заказа. Поменять статус заказа можно только отправив заявку менеджеру. Имитируй это действие отдельной публичной функцией. Она будет принимать новый статус и обращаться к внутреннему методу класса для изменения статуса.

❌ Ошибки

  • не делают внутренний класс для изменения статуса приватным

  • не инкапсулируют все поля класса

✏️ Комментарии

Должны быть инкапсулированы все поля. Именно для этого мы создаем метод, который отвечает за обращение к скрытому полю.
Немного надо доработать логику. К менеджеру мы можем обратиться извне, да. но метод changeOrder() должен быть инкапсулирован от внешнего мира. К нему можно обратиться только внутри класса.
Цель продемонстрировать реализацию инкапсуляции, когда мы не вызываем публичный метод, а вызываем вспомогательный, который в свою очередь дергает другой приватный метод класса и передает в него необходимые данные. То есть чтобы нельзя было сразу напрямую обратиться в скрытый метод.

🧾 Решение

class Order(private val orderNumber: Int) {
    private var status: String = "в ожидании"

    private fun changeStatus(newStatus: String) {
        this.status = newStatus
        println("Статус заказа номер $orderNumber был изменен на $newStatus")
    }

    fun requestStatusChange(newStatus: String) {
        println("Отправка запроса на изменение статуса заказа номер $orderNumber...")
        changeStatus(newStatus)
    }

    fun getStatus(): String {
        return status
    }
}

fun main() {
    val order = Order(1234)
    println("Текущий статус заказа: ${order.getStatus()}")

    order.requestStatusChange("подтвержден")
    println("Текущий статус заказа: ${order.getStatus()}")
}