Наследование позволяет нам абстрагировать общие параметры класса для того, чтобы чтобы избежать множественного повторения логики и облегчить классы. Помимо обычный классов в Scala существует абстрактный вид классов(abstract class), отличие от обычный классов в том, что мы не может создать экземпляр такого класса, они созданы лишь для последующего наследования другими классами: abstract class A {def a: String}
class D extends A {override def a: String = ???} Как видите, после наследования абстрактного класса(ключевое слово extends), мы обязаны имплементировать все методы, существующие в абстрактном классе(ключевое слово override). Что нам даст такой подход, спросите вы? Тут в игру входит полиморфизм: теперь мы можем принимать в качестве аргуметов функций/создавать массивы/ возвращать значения и пр. класса А, содержащие любые из классов, наследующих этот класс. Т.е. при вызове метода def s(a:A) в качестве аргумента можно подсунуть экземпляр класса D. def s(a:A) = a match {
case c: D =