Traits

    A trait encapsulates methods and attributes into a single unit. The main purpose of the creation of traits is to enhance reusability by using inheritance.

    As we already discussed while doing inheritance, we can extend only a single class but unlike classes, we can mixin any number of traits.

    If you are familiar with Java. You can understand traits as a combination of abstract classes and interfaces.

    A trait can be created by using a keyword trait. Object creation for a trait is impossible until it is extended by a class where it can be defined completely.

    Example:

    trait Phone {
     val modelNumber: Long
     def call(): String
    }
    
    class SamsungPhone extends Phone {
     override val modelNumber = 12345L
     override def call(): String = "I am calling from Samsung phone"
     def clickPhotos() = "I am capable of clicking pictures also"
    }
    
    class OnePlusPhone extends Phone {
     override val modelNumber = 2345L
     override def call() = "I can click HD pics"
    }
    
    val onePlus7pro = new OnePlusPhone
    onePlus7pro.call()
    onePlus7pro.modelNumber

    In some languages, this feature is available to extend multiple classes in a single class. But this feature is not available in Scala, that's why we needed a trait.

    Syntax to extend:

    Class A extend ClassB with TraitC with TraitD