Skip to content

ДЗ - #75

Open
kodergen wants to merge 1 commit into
Android-Developer-Basic:masterfrom
kodergen:master
Open

ДЗ#75
kodergen wants to merge 1 commit into
Android-Developer-Basic:masterfrom
kodergen:master

Conversation

@kodergen

@kodergen kodergen commented Sep 5, 2026

Copy link
Copy Markdown

No description provided.

@motorro

motorro commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator

@kodergen, пример использования sealed структуры:

/**
 * Базовый бачок (без усложнений на вид топлива)
 */
open class Tank {
    var contents: Double = 0.0
        private set

    open fun addFuel(fuel: Fuel) {
        contents += fuel.amount
    }
}

/**
 * ТАЗ
 */
object Taz {
    /**
     * Дырявый бачок ТАЗа
     */
    private val tank = object : Tank() {
        override fun addFuel(fuel: Fuel) {
            throw RuntimeException("BANG!!!")
        }
    }
}

/**
 * Типы топлива
 */
sealed class Fuel {
    abstract val amount: Double

    data class Gasoline(override val amount: Double) : Fuel()
    data class LiquefiedGas(override val amount: Double) : Fuel()
}

/**
 * Горловина, жестко связанная с тем топливом, что она может
 * принять
 */
sealed class TankMouth(protected val tank: Tank) {

    class GasolineMouth(tank: Tank) : TankMouth(tank) {
        fun refuel(fuel: Fuel.Gasoline) {
            tank.addFuel(fuel)
        }
    }

    class GasMouth(tank: Tank) : TankMouth(tank) {
        fun refuel(fuel: Fuel.LiquefiedGas) {
            tank.addFuel(fuel)
        }
    }
}

/**
 * Функция заправки (с помощью when) четко будет знать, какое
 * топливо в какую горловину лить
 */
fun refuel(mouth: TankMouth, amount: Double) {
    when(mouth) {
        // Tут только бензин
        is TankMouth.GasMouth -> mouth.refuel(Fuel.LiquefiedGas(amount))
        // Тут только газ
        is TankMouth.GasolineMouth -> mouth.refuel(Fuel.Gasoline(amount))
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants