Kotlin
Наследование класса
Поиск…
Вступление
Любой объектно-ориентированный язык программирования имеет некоторую форму наследования классов. Позвольте мне пересмотреть:
Представьте себе, что вам пришлось запрограммировать кучу фруктов: 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
}
}