Работа с лямбдой. Kotlin
Пытаюсь реализовать паттерн Стратегия при помощи лямбд в функциональном стиле. Идея: есть классы FlyBehavior, DanceBehavior, в них определил лямбды, правильно или нет - не знаю (первый раз с работаю с ними), теперь эти лямбды мне вроде как нужно передать в конструктор DecoyDuck, который наследуется от Duck. Как мне это сделать и правильный ли у меня подход?
open class Duck {
fun swim() = println("I'm swimming!")
open fun display() {}
}
class DecoyDuck : Duck() {
override fun display() = println("I'm a decoy duck!")
}
class FlyBehavior(
val flyWithWings: () -> Unit = {println("I'm flying!")},
private val flyNoWay: () -> Unit,
) {}
class DanceBehavior(
private val minuetBehavior: () -> Unit = {println("I'm dancing minuet!")},
private val waltzBehavior: () -> Unit = {println("I'm dancing waltz!")},
private val noDanceBehavior: () -> Unit
) {}
По моему должно выглядеть как то так, определяем функцию fly в Duck(), и передаем туда конкретную лямбду, для конкретного класса, например для DecoyDuck. DecoyDuck наследует функцию fly уже с конкретной нужной лямбдой
open class Duck(
flyBehavior: () -> Unit,
danceBehavior: () -> Unit,
quackBehavior: () -> Unit
) {
// fun fly(flyBehavior: () -> Unit) {
// flyBehavior.invoke()
// }
fun swim() = println("I'm swimming!")
open fun display() {}
}
class DecoyDuck: Duck(flyBehavior.flyNoWay, danceBehavior.noDanceBehavior, quackBehavior.muteQuackBehavior) {
override fun display() = println("I'm a decoy duck!")
}
но как это реализовать я до сих пор не догоняю
Ответы (1 шт):
Если я правильно понял, то Вам нужно сделать нечто подобное:
open class Duck(
private val flyBehavior: () -> Unit, // для того, чтобы использовать
private val danceBehavior: () -> Unit, // параметр конструктора после
private val quackBehavior: () -> Unit // того, как объект уже
) { // инициализирован, нужно проставить ключевое слово val или var
fun fly() = flyBehavior()
fun dance() = danceBehavior()
fun quack() = quackBehavior()
fun swim() = println("I'm swimming!")
open fun display() {}
}
object FlyBehavior {
val flyWithWings: () -> Unit = { println("I'm flying!") }
val flyNoWay: () -> Unit = {}
}
object DanceBehavior {
val minuetBehavior: () -> Unit = { println("I'm dancing minuet!") }
val waltzBehavior: () -> Unit = { println("I'm dancing waltz!") }
val noDanceBehavior: () -> Unit = {}
}
object QuackBehavior {
val justQuack: () -> Unit = { println("Quack motherfucker!") }
val muteQuackBehavior: () -> Unit = {}
}
class DecoyDuck : Duck(FlyBehavior.flyNoWay, DanceBehavior.noDanceBehavior, QuackBehavior.justQuack) {
override fun display() = println("I'm a decoy duck!")
}
Пример использования:
DecoyDuck().apply {
fly()
dance()
quack()
swim()
}