Писалось для знакомого студента, не смотрите на избыточный код.
object BikeDrivingSkill extends Enumeration { type BikeDrivingSkill = Value; val Novice, Advanced, Expert = Value; } class Human(var name: String) { override def toString(): String = s"Привет меня звать $name."; def tellAboutSelf(): Unit = println(this.toString()); def getName(): String = name; def setName(value: String): Unit = name = value; } class Bicyclist(val _name: String, var skill: BikeDrivingSkill.BikeDrivingSkill) extends Human(_name) { import BikeDrivingSkill.*; override def toString(): String = { var skill = this.skill match { case Novice => "новичёк" case Advanced => "умею водить велосипед"; case Expert => "отличо управляю велосипедом" case whoa => "Unexpected case: " + whoa.toString }; return s"${super.toString()} И я ${skill}."; } def train(): Unit = { if (this.skill == BikeDrivingSkill.Expert) { println("Мне не нужно больше тренероваться, я и так эксперт."); } else { println("Я пошел тренероваться.") val nextId = this.skill.id + 1 // извлечём номер Advanced = 2 // следующий номер Expert = 3 this.skill = BikeDrivingSkill(nextId) // по номеру достанем значение } } } object Main extends App { val unit = new Bicyclist("Egils Levits", BikeDrivingSkill.Advanced); unit.tellAboutSelf(); unit.train(); unit.tellAboutSelf(); unit.train(); }