Scala For Beginners - Crash Course - Part 2

Scala For Beginners - Crash Course - Part 2

Object-Oriented Programming in Scala

ยท

6 min read

Welcome to the 2nd part of scala beginners crash course, here we will go through the object-oriented way of scala programming language and concepts like anonymous class, case classes and traits!

It will be a no-nonsense, to the point kind of article (like part 1) with all necessary links wherever needed.

Without further ado, let's get started.


Before We Start

Before we start coding out, first create a new object in crashcourse package (please go through part 1 for more information on creating packages and objects).

Let's name it ClassAndObject like below:

classandobject.png

Now, we can start coding out examples on this scala application.


Classes And Objects

In scala, to define a class we use the class keyword:

classkeyword.png

We can directly use the Student class later in the program. That's it! that's how we can create a class in scala.

It is different from writing object Student as it is not instantiated right away, we have just defined it and are not using it anywhere. To instantiate a class we can use the new keyword.

newkeyword.png

A class can have parameters, like this:

classargs.png

Note: Class parameters are not class fields, which means we can not use these parameters with instantiated objects.

To make class parameters as class fields, we have to use the val keyword along with the name of the parameter, like this:

valclassargs.png

We can use class parameters within the class code block by using the this keyword if value name conflict occurs, like below:

usingthis.png

If value name conflict does not occur, then the class method by default (implicitly) uses the this operator on class parameters values.

Some other important concepts:

  • Overloading occurs with only different signature methods. More on overloading in scala here.
  • Auxiliary constructor are generally used for default parameters. More on auxiliary constructor here.
  • Instances are fixed, whenever we want to do something with the given class, say creating/updating something, then we would need to instantiate a new class, it is the clause of immutability, useful in functional programming.

Conceptually, scala does not provide class level functionality, like a static class. However, scala provides something called an object, using which we can obtain class level functionalities.

Scala objects are singleton instances by definition. We can create an object like the below code:

object.png

We can create an object with the same name as that of a class in the same scope, creating such an object/class is called companion object/class, known as companions.

Companions can be used to make a factory method in objects, that can help instantiate a class in a certain way. Using companions does not require using the new keyword to instantiate a scala class, we can define a method named apply within the object to handle instantiation.

We can create a companion like below:

companion.png

Well, that's about it on classes and objects in scala. You can check out official docs on scala classes here and on objects here.

Anonymous And Case Classes

To create an anonymous class we can directly define the class like this:

anonclass.png

Things to remember when creating an anonymous class:

  • Pass proper parameters whenever required.
  • Anonymous class declaration works for abstract as well as for non-abstract classes. It works for traits as well.

    Note: We will discuss abstract classes and traits in the next section.

  • Useful for on-spot declaration in some scenarios.

Using the case keyword in front of the class keyword will make it a case class, like this:

caseclass.png

Case classes promote class parameters to fields, it has a predefined toString method that evaluates to a representation that is understandable.

Equality and hashcodes are implemented out-of-the-box with a handy copy method to copy instances. Case classes come with their companion objects predefined.

Things to remember when creating a case class:

  • Case class is a quick lightweight data structure with little boilerplate.
  • Case classes are serializable and used with the Akka framework.
  • Case classes have extractor patterns that can be used in pattern matching.
  • Case objects are the same as case classes but don't get companion objects as they themselves are objects.

Well, that's about it on anonymous class and case class in scala.

Inheritance, Abstract Class And Traits

Scala offers single level inheritance. Inheriting a class inherits public methods and protected methods can be used within the child class.

Inheritance example:

inheritance.png

Important notes on inheritance overriding:

  • To override methods, use the override keyword. Override works for val, var, def or anything within in the class.
  • To prevent override, we have to use the final keyword.
  • Put a final keyword before class to altogether prevent the inheritance of a class.
  • Use the sealed keyword to restrict inheritance in different scopes of the program.

Moving on to abstract classes in scala, we have to use the abstract keyword to make an abstract class and an abstract class cannot be instantiated, however, we can create an anonymous class using the new keyword and defining all the methods within that anonymous code block.

abstractclass.png

Traits are similar to interfaces in java. They are also used to declare undefined or unimplemented methods. We have to use the trait keyword to define traits in scala.

trait.png

Important points to note for abstract classes and traits in scala:

  • Abstract class can have both abstract and non-abstract methods. It is the same for traits.
  • Traits does not have constructor parameters.
  • Classes can inherit multiple traits, but not multiple classes.
  • Traits are used to define the behaviour of a class.
  • Abstract class is the type of thing itself.

Note: If you see ??? in abstract/trait methods, it means that method is not implemented and evaluates to Nothing.

Well, that's about it on inheritance, abstract class and traits in scala.

Below are some of the external links you can go through to get a more in-depth understanding of object-oriented programming in scala.

Wrap Up

Well, that wraps up part 2 of this crash course.

In the next part, we will discuss functions, HOFs, curries and much more related to functional programming in scala.


  • Make sure to follow me to get regular updates or subscribe so that you never miss my upcoming articles, ranging from Python to Computer Vision to Scala.

  • Just starting your Open Source Journey? Don't forget to check Hello Open Source

  • Want to showcase your Python project or just out there to explore? Check Awesome Python Repos

  • Want to make a simple and awesome game from scratch? Check out PongPong

  • Want to ++ your GitHub Profile README? Check out Quote - README

Till next time!

Namaste ๐Ÿ™

Did you find this article valuable?

Support Siddharth Chandra by becoming a sponsor. Any amount is appreciated!

ย