Abstract classes and methods in Kotlin - Time & Space Complexity
We want to understand how the time it takes to run code using abstract classes and methods changes as the input grows.
Specifically, we ask: how does using abstract methods affect the speed of running a program?
Analyze the time complexity of the following code snippet.
abstract class Shape {
abstract fun area(): Double
}
class Circle(val radius: Double) : Shape() {
override fun area() = 3.14 * radius * radius
}
fun totalArea(shapes: List<Shape>): Double {
var sum = 0.0
for (shape in shapes) {
sum += shape.area()
}
return sum
}
This code defines an abstract class with an abstract method, then calculates the total area of many shapes by calling the method on each.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Looping through the list of shapes and calling the
area()method on each. - How many times: Once for each shape in the list (n times if the list has n shapes).
As the number of shapes increases, the program calls the area() method more times, one per shape.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 calls to area() |
| 100 | 100 calls to area() |
| 1000 | 1000 calls to area() |
Pattern observation: The number of operations grows directly with the number of shapes.
Time Complexity: O(n)
This means the time to compute total area grows in a straight line with the number of shapes.
[X] Wrong: "Using abstract methods makes the program slower by a lot because of extra overhead."
[OK] Correct: Calling abstract methods adds only a tiny fixed cost per call, so the overall time still grows mainly with the number of shapes, not the method type.
Understanding how abstract methods affect time helps you explain design choices clearly and shows you know how code structure relates to performance.
What if we added a nested loop inside the area() method that runs proportional to the size of some input? How would the time complexity change?
Practice
abstract class in Kotlin?Solution
Step 1: Understand abstract class instantiation rules
Abstract classes cannot create objects directly because they are incomplete by design.Step 2: Check method types in abstract classes
Abstract classes can have both abstract methods (without body) and concrete methods (with body).Final Answer:
It cannot be instantiated directly and may contain abstract methods. -> Option AQuick Check:
Abstract class = no direct objects + can have abstract methods [OK]
- Thinking abstract classes can be instantiated
- Believing abstract classes can't have method bodies
- Confusing abstract classes with interfaces
Solution
Step 1: Recall Kotlin syntax for abstract methods
In Kotlin, abstract methods are declared with theabstractkeyword beforefun, followed by the method signature without a body.Step 2: Check each option's syntax
Only abstract fun calculate(): Int matches the correct syntax:abstract fun calculate(): Int. Others have incorrect keyword order or punctuation.Final Answer:
abstract fun calculate(): Int -> Option AQuick Check:
abstract fun method() = correct syntax [OK]
- Placing abstract after fun
- Adding a method body to abstract methods
- Incorrect keyword order
abstract class Animal {
abstract fun sound(): String
}
class Dog : Animal() {
override fun sound() = "Bark"
}
fun main() {
val dog = Dog()
println(dog.sound())
}Solution
Step 1: Understand class inheritance and method override
The abstract classAnimalhas an abstract methodsound(). The subclassDogoverrides it to return "Bark".Step 2: Analyze main function output
Creating aDogobject and callingsound()prints "Bark".Final Answer:
Bark -> Option CQuick Check:
Overridden method returns "Bark" [OK]
- Expecting abstract class method to run
- Confusing method name with output
- Thinking abstract class can be instantiated
abstract class Vehicle {
abstract fun drive()
}
class Car : Vehicle() {
fun drive() {
println("Driving")
}
}Solution
Step 1: Check method overriding rules in Kotlin
When a subclass implements an abstract method, it must use theoverridekeyword.Step 2: Identify missing override keyword
TheCarclass definesdrive()withoutoverride, causing a compilation error.Final Answer:
Missing override keyword in Car's drive method -> Option DQuick Check:
Override keyword required for abstract method implementation [OK]
- Omitting override keyword
- Adding body to abstract method in base class
- Misunderstanding inheritance rules
abstract class Shape {
abstract fun area(): Double
fun description() = "Shape area is ${area()}"
}
class Circle(val radius: Double) : Shape() {
override fun area() = 3.14 * radius * radius
}
fun main() {
val c = Circle(2.0)
println(c.description())
}Solution
Step 1: Calculate area in Circle subclass
Area = π * radius² = 3.14 * 2.0 * 2.0 = 12.56Step 2: Call description method from Shape
Description returns string with area value: "Shape area is 12.56".Final Answer:
Shape area is 12.56 -> Option BQuick Check:
Abstract method overridden, description uses area() [OK]
- Forgetting to override abstract method
- Miscomputing area formula
- Expecting abstract class method to run alone
Ready to prove it?
Pass the test and this pattern moves unknown
