Inheritance in Kotlin with Code Examples

Rauf Aghayev
3 min readAug 16, 2023

--

https://kotlinlang.org/

In the realm of object-oriented programming, inheritance stands as a foundational concept that facilitates the creation of new classes based on existing ones. This practice enhances code reusability, fosters the development of specialized classes, and establishes an efficient organizational hierarchy. Kotlin, a modern programming language with JVM compatibility, offers a feature-rich environment for implementing inheritance in an elegant and expressive manner. This article delves into the intricacies of inheritance in Kotlin, supported by comprehensive code examples that elucidate its practical application.

Grasping the Essence of Inheritance

Inheritance empowers developers to define a new class by inheriting attributes and behaviors (methods) from an established class. This existing class is termed the base class or parent class, while the new class assumes the role of the derived class or child class. The derived class seamlessly inherits the characteristics of the base class and retains the flexibility to introduce its own properties and methods.

In Kotlin, the class keyword marks the initiation of inheritance, followed by the class name and a colon. Subsequently, the name of the base class is specified.

open class Animal(val name: String) {
fun speak() {
println("$name makes a sound")
}
}

class Dog(name: String) : Animal(name) {
fun bark() {
println("$name barks")
}
}

In this illustration, an Animal class functions as the base class, equipped with a property named name and a method titled speak(). On the other hand, the Dog class emerges as the derived class, inheriting from Animal and introducing an exclusive method called bark().

The Art of Method Overriding

Within Kotlin’s realm, the override mechanism empowers developers to alter and enhance the methods and properties of the base class in the derived class. By affixing the open modifier to the base class and the override modifier to the derived class, developers unveil an avenue for redefining inherited features.

open class Shape {
open fun draw() {
println("Drawing a shape")
}
}

class Circle : Shape() {
override fun draw() {
println("Drawing a circle")
}
}

Navigating Constructors in Derived Classes

Upon the creation of a derived class, it is imperative to invoke the constructor of the base class. Kotlin introduces the super keyword, serving as a conduit to access the base class's constructor or methods.

open class Vehicle(val brand: String) {
open fun honk() {
println("Vehicle honks")
}
}

class Car(brand: String, val model: String) : Vehicle(brand) {
override fun honk() {
println("$brand $model honks")
}
}

Gaining Access to Base Class Members

Derived classes seamlessly access the properties and methods of the base class by employing the super keyword.

open class Fruit(val name: String) {
open fun eat() {
println("Eating $name")
}
}

class Orange(name: String) : Fruit(name) {
override fun eat() {
super.eat()
println("Peeling and enjoying the $name")
}
}

The Notion of Sealed Classes

In certain scenarios, inhibiting further inheritance of a class is desirable. While Kotlin’s default stance enables classes to be inherited, the final modifier can be harnessed to preclude such a scenario.

open class Base {
// ...
}

final class Derived : Base() {
// This class cannot be further inherited
}

A Culmination of Concepts

The tapestry of inheritance weaves a rich fabric within the Kotlin programming landscape. By harnessing inheritance’s capabilities, developers engender new classes, cultivate code reusability, and forge well-organized class hierarchies. Kotlin’s succinct and expressive syntax, complemented by method overriding, constructor invocation, and base class member accessibility, bestows an environment conducive to effective inheritance implementation.

Incorporating a profound comprehension of inheritance will invariably foster the creation of modular and sustainable codebases in Kotlin projects. As your exploration of Kotlin’s intricacies continues, the art of inheritance shall retain its pivotal role in sculpting your object-oriented programming endeavors.

--

--