Полиморфизм в Котлине
Слово полиморфизм означает наличие множества форм. Проще говоря, мы можем определить полиморфизм как способность сообщения отображаться более чем в одной форме.
Реальная иллюстрация: полиморфизм
Человек одновременно может иметь разные характеристики. Как и мужчина одновременно является отцом, мужем, работником. Так что один и тот же человек в разных ситуациях ведет себя по-разному. Это называется полиморфизмом. Полиморфизм считается одной из важных особенностей объектно-ориентированного программирования. Полиморфизм позволяет нам выполнять одно и то же действие разными способами. Другими словами, полиморфизм позволяет определить один интерфейс и иметь несколько реализаций. Слово «поли» означает «много», а «морфы» — формы, поэтому оно означает «много форм».
Типы полиморфизма
Полиморфизм в основном делится на два типа:
- Полиморфизм времени компиляции
- Полиморфизм времени выполнения
Примеры
Пример 1: Полиморфизм времени компиляции
Начнем с полиморфизма времени компиляции. При полиморфизме времени компиляции имя функции, т. е. сигнатура, остается прежней, но параметры или тип возвращаемого значения другие. Затем во время компиляции компилятор определяет, какие функции мы пытаемся вызвать, на основе типа параметров и многого другого. Посмотрите этот пример:
Kotlin
fun main (args: Array<String>) { 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 } |
Выход:
8 8.6 8.646
Пример 2. Полиморфизм времени выполнения
Теперь давайте поговорим о полиморфизме во время выполнения. При полиморфизме времени выполнения компилятор разрешает вызов переопределенных/перегруженных методов во время выполнения. Мы можем добиться полиморфизма во время выполнения, используя переопределение методов. Давайте попробуем пример, в котором мы расширяем суперкласс и переопределяем один из его методов-членов:
Kotlin
fun main(args: Array<string>){ 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
Здесь компилятор во время выполнения решает, какой метод выполнять.