Поиск…


Вступление

Любой объектно-ориентированный язык программирования имеет некоторую форму наследования классов. Позвольте мне пересмотреть:

Представьте себе, что вам пришлось запрограммировать кучу фруктов: Apples , Oranges и Pears . Все они различаются по размеру, форме и цвету, поэтому у нас разные классы.

Но скажем, их различия не имеют значения на секунду, и вы просто хотите, чтобы Fruit , независимо от того, что именно? Какой тип возврата будет getFruit() ?

Ответ - класс Fruit . Мы создаем новый класс и накладываем на него все плоды!

Синтаксис

  • открыть {базовый класс}
  • class {Производный класс}: {Базовый класс} ({Аргументы инициализации})
  • override {Function Definition}
  • {DC-Object} - {Base Class} == true

параметры

параметр подробности
Базовый класс Класс, унаследованный от
Производный класс Класс, который наследуется от базового класса
Инициировать аргументы Аргументы, переданные конструктору базового класса
Определение функции Функция в производном классе, которая отличается от кода в базовом классе
DC-Object Объект «Производный класс-объект», который имеет тип производного класса

Основы: ключевое слово 'open'

В Котлине классы по умолчанию окончательны, что означает, что они не могут быть унаследованы.

Чтобы разрешить наследование для класса, используйте ключевое слово open .

open class Thing {
    // I can now be extended!
}

Примечание. Абстрактные классы, закрытые классы и интерфейсы будут open по умолчанию.

Наследование полей из класса

Определение базового класса:

open class BaseClass {
    val x = 10
}

Определение производного класса:

class DerivedClass: BaseClass() {
    fun foo() {
        println("x is equal to " + x)
    }
}

Использование подкласса:

fun main(args: Array<String>) {
    val derivedClass = DerivedClass()
    derivedClass.foo() // prints: 'x is equal to 10'
}

Наследование методов из класса

Определение базового класса:

open class Person {
    fun jump() {
        println("Jumping...")
    }
}

Определение производного класса:

class Ninja: Person() {
    fun sneak() {
        println("Sneaking around...")
    }
}

Ниндзя имеет доступ ко всем методам в Person

fun main(args: Array<String>) {
    val ninja = Ninja()
    ninja.jump()  // prints: 'Jumping...'
    ninja.sneak() // prints: 'Sneaking around...'
}

Переопределение свойств и методов

Переопределение свойств (как для чтения, так и для изменяемых):

abstract class Car {
    abstract val name: String;
    open var speed: Int = 0;
}

class BrokenCar(override val name: String) : Car() {
    override var speed: Int
        get() = 0
        set(value) {
            throw UnsupportedOperationException("The car is bloken")
        }
}

fun main(args: Array<String>) {
    val car: Car = BrokenCar("Lada")
    car.speed = 10
}

Переопределение методов:

interface Ship {
    fun sail()
    fun sink()
}

object Titanic : Ship {

    var canSail = true

    override fun sail() {
        sink()
    }

    override fun sink() {
        canSail = false
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow