Scala's Abstract Classes, Traits, and Companion Objects

Topic Overview

Welcome to an exploration of Scala's Abstract Classes, Traits, and Companion Objects. These elements are fundamental to Scala's Object-Oriented Programming, enabling flexible and robust code structures, similar to blueprints for real-world entities.

Diving Into Abstract Classes

Consider an abstract class to be a "generic" real-world category — for instance, a vehicle. We have various types of vehicles, such as cars, trucks, and bikes, that share certain characteristics. We can represent these common features using an abstract class called Vehicle. Abstract classes in Scala, too, are outlines for other classes and cannot be instantiated independently. Subclasses need to provide implementations for the abstract members.

Scala
abstract class Vehicle:
    var color: String
    def move(): Unit
    def description = s"This is a vehicle of color $color." // Provides a textual description of the vehicle

The abstract class Vehicle defines common behavior through abstract members, such as the move method and color variable. The description method provides a textual description of the vehicle by utilizing the color property. Implementations of these abstract members have to be provided by any class that extends Vehicle.

Scala
class Car extends Vehicle:
    var color: String = "Red"
    def move(): Unit = println("The car is moving")

class Truck extends Vehicle:
    var color: String = "Blue"
    def move(): Unit = println("The truck is moving")

@main def run: Unit =
    val car = Car()
    println(car.description) // Prints: "This is a vehicle of color Red"
    car.move() // Prints: "The car is moving"

    val truck = Truck()
    println(truck.description) // Prints: "This is a vehicle of color Blue"
    truck.move() // Prints: "The truck is moving"

Here, both Car and Truck classes provide specific implementations of the move method and color property defined in the Vehicle abstract class. Because the parent class Vehicle is abstract, the child classes do not need to use override to provide these method implementations. These subclasses must implement the move method and color property since Vehicle is an abstract class. Consequently, they each portray unique attributes and behaviors indicative of the different types of Vehicles.

Shaking Hands with Traits

Sign up

Join the 1M+ learners on CodeSignal

Be a part of our community of 1M+ users who develop and demonstrate their skills on CodeSignal