问题的历史:
Kotlin结合了Java的优点和JVM的函数继承。普通类作为标准结构声明,抽象类允许创建未完全定义的模板并提供默认实现,而接口则支持无状态的多重行为继承。
问题:
在类、抽象类和接口之间的正确选择决定了应用程序的架构、代码的粒度及其可扩展性。错误的继承会导致测试和今后变更的复杂性。
解决方案:
在Kotlin中:
代码示例:
interface Drawable { fun draw() } abstract class Shape(var color: String) : Drawable { abstract fun calcArea(): Double override fun draw() = println("Shape drawn") } class Circle(color: String, val radius: Double) : Shape(color) { override fun calcArea() = Math.PI * radius * radius }
关键特性:
接口可以包含带有后备字段的属性吗?
不可以,它们只能定义属性的签名,而不能存储数据—没有后备字段的属性。
可以从多个类继承吗?
不可以,Kotlin仅支持类的单一继承,但支持接口的多重实现。
接口可以声明构造函数吗?
不可以,接口不支持构造函数,因为它不存储状态—仅行为合同。
在应用程序中,将所有公共功能移到抽象类中,即使没有内部逻辑或状态,需求只是一个公共合同。
优点:
缺点:
仅将必要的合同提取到接口中,抽象类限制为需要实现的公共属性和方法。
优点:
缺点: