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 mix in any number of traits.

    Suppose 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.


    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

    This feature is available in some languages 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