Here we see three object-oriented mechanisms in action inside of F#. hotel and motel are classes, class motel inherits class hotel, and the numberOfRooms is a privately encapsulated field of the motel class. Also note that we publicly expose numberOfRooms with the property NumberOfRooms.
#light
type hotel = class
val name : string
new() = {name = "Hotel California"}
end
type
motel = class
inherit hotel
val mutable private numberOfRooms: int
val CAPACITY : int
member x.CalculateRate = (float)x.numberOfRooms * 125.50
member x.IncrementRooms(n) = x.numberOfRooms <- x.numberOfRooms + n
member x.Vacant = (x.numberOfRooms = 0)
member x.Filled = (x.numberOfRooms > x.CAPACITY)
member this.NumberOfRooms
with get() = this.numberOfRooms
and set((v:int)) = (this.numberOfRooms <- v)
new() = { CAPACITY = 400
numberOfRooms = 0 }
end
open
System
let motel1 = new motel()
Console.WriteLine("***** {0} *******", motel1.name)
Console.WriteLine ("number of rooms = {0}", motel1.NumberOfRooms)
if (motel1.Vacant) then
Console.WriteLine ("The motel is empty")
motel1.IncrementRooms (5)
Console.WriteLine ("number of rooms = {0} costing {1:c}", motel1.NumberOfRooms, motel1 .CalculateRate )
if
(motel1.Vacant) then
Console.WriteLine ("The hotel is empty")motel1.NumberOfRooms <- 400
Console.WriteLine ("number of rooms = {0} costing {1:c}", motel1.NumberOfRooms, motel1.CalculateRate )
Console.ReadLine()
The code above excercises the IncrementRoom method and the NumberOfRooms Property to simulate the occupation of a motel. It also calculates the total rate from the number of rooms occupied at any given time.
The result of running the code listed above is shown in the screenshot below.