Class Functions
Just like in other OO languages, there are two ways to define a function (method) inside a class:
- Inside class definition
- Outside class definition
Inside Class Definition
local class = ClassPP.class
local Car = class "Car" {
Public = {
Brand = "Lamborghini",
getLicensePlate = function(self)
print(self.License_Plate)
end
},
Private = {
License_Plate = "XXXX"
}
}
In this example, we have defined a function inside the Public Access Specifier called getLicensePlate
, this function when called will print the license plate of our object.
Now, let's create an object from this class:
local class = ClassPP.class
local Car = class "Car" {
Public = {
Brand = "Lamborghini",
getLicensePlate = function(self)
print(self.License_Plate)
end
},
Private = {
License_Plate = "XXXX"
}
}
local newCar = Car.new()
newCar:getLicensePlate()
You might have noticed that we've called the getLicensePlate
function with the :
(colon) operator. This is a syntax sugar that we use to pass the object itself as the first argument to a function. Calling a function with the :
operator is equivalent to calling it like object.method(object)
, but it makes our job easier because we don't have to manually pass the object every single time.
Due to this, the first argument of a function will always be what we call self
, that is a pointer to the object. We use it to access the object's properties and functions from a class function.
Functions with multiple parameters
local class = ClassPP.class
local Car = class "Car" {
Public = {
Brand = "Lamborghini",
setLicensePlate = function(self, newPlate)
self.License_Plate = newPlate
end,
getLicensePlate = function(self)
return self.License_Plate
end
},
Private = {
License_Plate = "XXXX"
}
}
local newCar = Car.new()
newCar:setLicensePlate("A1B2C3") -- Calling the function with an argument
print(newCar:getLicensePlate()) -- Prints "A1B2C3"!
In the example above, we added a new function called setLicensePlate
that updates the private member License_Plate
with the provided newPlate
parameter. We've also updated the getLicensePlate
function to return the private member License_Plate
, which we then use to print the now updated value of the member. As you can see, you can call the class functions with multiple parameters easily by following the method in the example.
You can also notice that since the self
is the first argument, all the other arguments that come after will start at 2.
Outside Class Definition
To define a function outside of the class, you must define it as: function Class.<accessSpecifier>:<functionName>
local class = ClassPP.class
local Car = class "Car" {
Public = {
Brand = "Lamborghini",
},
Private = {
License_Plate = "XXXX"
}
}
function Car.Public:getLicensePlate(number)
print(self.License_Plate, number) -- Prints "XXXX 1"!
end
local newCar = Car.new()
newCar:getLicensePlate(1)
In this example, we defined a function outside of the class by specifying the class name, then the access specifier, followed by the :
operator and the name of the function. Unlike in some other OO languages, you do not have to define the function inside the class first to use this method.
Info
Outside Class Definition syntax is recommended as it allows for a better formatting style.
Info
Class Functions are also called Class Methods, and we will use this term from now on in later pages.