scala> /**************************************** | An Abstract Class | *****************************************/ | abstract class SubjectInfo { | def name: String | def mark: Int = 35 | def date: String = "2016/10/10" | } defined class SubjectInfo scala> scala> /**************************************** | Extending the abstract class : | This do not Compile | *****************************************/ | class Math(mk: Int) extends SubjectInfo { | // A method can also be overridden with a val #225 | // The reason we are able to do this is ; because | // in scala ; fields and methods share the same namespace | // Scala has two namespaces | // values (fields, methods, packages & Singleton Objects) | // types (class & trait names) | // Note here ; we are overriding an abstract method | val name = "math" | | // This gives compilation error ; any concrete method | // overridden requires the 'override' modifier | def mark = mk + 5 | } <console>:59: error: overriding method mark in class SubjectInfo of type => Int; method mark needs `override' modifier def mark = mk + 5 ^ scala> scala> /**************************************** | Extending the abstract class : | This compiles successfully | *****************************************/ | class Math(mk: Int) extends SubjectInfo { | // A method can also be overridden with a val | // Note here ; we are overriding an abstract method | | val name = "math" | // Using 'override' modifier... | override val mark = mk | override def date = "2016/10/15" | } defined class Math scala> scala> /**************************************** | Parametric fields : Avoid unnecssary | code smell | *****************************************/ | class Math( | // By prefixing 'val' / 'var' we specify the parameter | // and field has the same name | // Other modifiers like ; private & protected are also possible | // #227 | override val mark: Int, | val assignmentMark: Int | ) extends SubjectInfo { | // A method can also be overridden with a val | // Note here ; we are overriding an abstract method | | val name = "math" | } defined class Math