Kotlin 中的多态性
多态性一词意味着具有多种形式。简单来说,我们可以将多态性定义为消息以多种形式显示的能力。
现实生活中的插图:多态性
一个人同时可以有不同的特征。就像一个男人同时是父亲、丈夫、雇员。因此,同一个人在不同的情况下具有不同的行为。这称为多态性。多态性被认为是面向对象编程的重要特征之一。多态性允许我们以不同的方式执行单个操作。换句话说,多态性允许您定义一个接口并具有多个实现。 “poly”这个词意味着许多,“morphs”意味着形式,所以它意味着许多形式。
多态性的类型
多态性主要分为两种:
- 编译时多态性
- 运行时多态性
例子
示例 1:编译时多态性
让我们从编译时多态性开始。在编译时多态中,函数的名称,即签名保持不变,但参数或返回类型不同。在编译时,编译器会根据参数类型等来解析我们尝试调用的函数。看看这个例子:
Kotlin
fun main (args: Array) {
println(doubleof(4))
println(doubleof(4.3))
println(doubleof(4.323))
}
fun doubleof(a: Int):Int {
return 2*a
}
fun doubleOf(a:Float):Float {
return 2*a
}
fun doubleof(a:Double):Double {
return 2.00*a
}
Kotlin
fun main(args: Array){
var a = Sup()
a.method1()
a.method2()
var b = Sum()
b.method1()
b.method1()
}
open class Sup{
open fun method1(){
println("printing method 1 from inside Sup")
}
fun method2(){
println("printing method 2 from inside Sup")
}
}
class Sum:Sup(){
override fun method1(){
println("printing method 1 from inside Sum")
}
}
输出:
8
8.6
8.646
示例 2:运行时多态性
现在,让我们谈谈运行时多态性。在运行时多态中,编译器在运行时解析对覆盖/重载方法的调用。我们可以使用方法覆盖来实现运行时多态性。让我们尝试一个扩展超类并覆盖其成员方法之一的示例:
科特林
fun main(args: Array){
var a = Sup()
a.method1()
a.method2()
var b = Sum()
b.method1()
b.method1()
}
open class Sup{
open fun method1(){
println("printing method 1 from inside Sup")
}
fun method2(){
println("printing method 2 from inside Sup")
}
}
class Sum:Sup(){
override fun method1(){
println("printing method 1 from inside Sum")
}
}
输出:
printing method 1 from inside Sup
printing method 2 from inside Sup
printing method 1 from inside Sum
printing method 2 from inside Sup
在这里,编译器在运行时解析要执行的方法。