Visibility rules
There are times when we don't want to let another class or similar construct use a few members. Here, we can use Scala's provided access modifiers. How we achieve control over the accessibility of members of our classes/traits/objects is through private, public, or protected access modifiers. Take a look at the following example:
package restaurant
package privaterestaurant {
case class Dish(name: String)
trait Kitchen {
self: PrivateRestaurant =>
private val secret = "Secret to tasty dish" //Think of a secret logical evaluation resulting in value, we don't want to expose.
def cookMyDish: Option[Dish] = Some(Dish(secret))
}
class PrivateRestaurant extends Kitchen {
def serveDishWithSecret = Dish(secret) // Symbol secret is inaccessible from this place.
def serveDish = cookMyDish // Works fine
}
} Here, we have some trait named Kitchen. It has a secret way of cooking a really tasty dish, but only for PrivateRestaurant...