【发布时间】:2018-12-31 19:28:11
【问题描述】:
由于在 java/kotlin 中不允许多重继承,因此利用接口默认方法很有用。举个例子:
abstract class Animal {
fun beAnimal() {
println("I'm animal!")
}
}
abstract class Mammal : Animal() {
fun produceMilk() {
beAnimal().apply { println("Freesh milk!") }
}
}
abstract class AnimalWithBeak : Animal() {
fun quack() {
beAnimal().apply { println("Quack!") }
}
}
class Platypus : ??? // I want it to both produce milk and quack!
如上所述,不允许多个基类,但我们可以使用接口:
abstract class Animal { fun beAnimal() { println("I'm animal!") } }
interface Mammal {
fun produceMilk() {
(this as Animal).beAnimal().apply { println("Freesh milk!") }
}
}
interface AnimalWithBeak {
fun quack() {
(this as Animal).beAnimal().apply { println("Quack!") }
}
}
class Platypus : Animal(), Mammal, AnimalWithBeak {
fun bePlatypus() {
quack() // ok
produceMilk() // ok
}
}
请注意,我没有 Animal 类,但我仍然想继承它,并且能够混合这些实现。上面的例子很简单,但在实际代码中它会非常有用。
问题是,不扩展Animal 的类可以实现Mammal 和AnimalWithBeak 接口。在这种情况下,代码将被破坏,因为this as Animal 演员将失败。
所以问题 - 是否可以将接口继承限制为仅对特定类?在这种情况下,应该只允许扩展Animal 的类实现Mammal 和AnimalWithBeak 接口。
可能不存在的抽象语法可能看起来像这样:
interface Mammal where this : Animal
但我怀疑它无效。有什么解决办法吗?
【问题讨论】:
-
Kotlin 中没有这样的功能。即使 Kotlin 有一个,Java 类仍然可以实现 Kotlin 接口,而无需考虑 Kotlin 自身的限制。
标签: inheritance kotlin default-method