2023-10-02 01:41:38 +00:00
|
|
|
# Classes
|
|
|
|
|
|
|
|
Basically kotlin syntax.
|
|
|
|
|
|
|
|
|
|
|
|
## Create a new instance of a class
|
|
|
|
|
|
|
|
`new` not required, in fact, forbidden.
|
|
|
|
|
|
|
|
```thp
|
2024-02-20 10:53:38 +00:00
|
|
|
val dog = Dog()
|
2023-10-02 01:41:38 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
## Simple class
|
|
|
|
|
|
|
|
Why'd you do this tho?
|
|
|
|
|
|
|
|
```thp
|
|
|
|
class SimpleClass
|
|
|
|
|
2024-02-20 10:53:38 +00:00
|
|
|
val instance = SimpleClass()
|
2023-10-02 01:41:38 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
## Properties & methods
|
|
|
|
|
|
|
|
```thp
|
|
|
|
class SimpleClass
|
|
|
|
{
|
|
|
|
// Properties are private by default
|
2024-02-20 10:17:21 +00:00
|
|
|
var String? name = ...
|
2023-10-02 01:41:38 +00:00
|
|
|
|
2023-10-24 01:39:34 +00:00
|
|
|
// Made public with `pub`
|
2024-02-20 10:17:21 +00:00
|
|
|
pub var String? surname = ...
|
2023-10-02 01:41:38 +00:00
|
|
|
|
|
|
|
// Methods are private by default
|
2023-11-04 12:17:32 +00:00
|
|
|
fun display_name()
|
2023-10-02 01:41:38 +00:00
|
|
|
{
|
2023-12-17 01:33:55 +00:00
|
|
|
// `$` is used instead of $this. Mandatory
|
2023-10-02 01:41:38 +00:00
|
|
|
print($name)
|
|
|
|
}
|
|
|
|
|
2023-11-04 12:17:32 +00:00
|
|
|
pub fun get_name() -> String?
|
2023-10-02 01:41:38 +00:00
|
|
|
{
|
|
|
|
$name
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
## Static members
|
|
|
|
|
|
|
|
no
|
|
|
|
|
|
|
|
|
|
|
|
## Constructor
|
|
|
|
|
|
|
|
Kotlin style
|
|
|
|
|
|
|
|
|
|
|
|
```thp
|
2023-12-17 01:33:55 +00:00
|
|
|
class Cat(
|
2024-02-20 10:17:21 +00:00
|
|
|
var String name,
|
|
|
|
var Int lives = 9,
|
|
|
|
val String surname = "Doe",
|
2023-12-17 01:33:55 +00:00
|
|
|
)
|
2023-10-02 01:41:38 +00:00
|
|
|
{
|
2023-11-04 12:17:32 +00:00
|
|
|
pub fun get_name() -> String
|
2023-10-02 01:41:38 +00:00
|
|
|
{
|
|
|
|
$name
|
|
|
|
}
|
2023-12-17 01:33:55 +00:00
|
|
|
|
|
|
|
pub fun die()
|
|
|
|
{
|
|
|
|
$lives -= 1
|
|
|
|
if $lives <= 0
|
|
|
|
{
|
|
|
|
print("Cat {$name} is death")
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
print("Cat {$name} is life still")
|
|
|
|
}
|
|
|
|
}
|
2023-10-02 01:41:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
val michifu = Cat("Michifu")
|
|
|
|
print(michifu.get_name())
|
|
|
|
```
|
|
|
|
|
2023-11-04 12:17:32 +00:00
|
|
|
With kotlin's `init` block.
|
|
|
|
|
|
|
|
```thp
|
2024-02-20 10:53:38 +00:00
|
|
|
class Dog(val String name)
|
2023-11-04 12:17:32 +00:00
|
|
|
{
|
2024-02-20 10:53:38 +00:00
|
|
|
Int name_length = name.length()
|
2023-11-04 12:17:32 +00:00
|
|
|
|
|
|
|
init
|
|
|
|
{
|
|
|
|
print("Dog has been instantiated")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2023-10-02 01:41:38 +00:00
|
|
|
## Inheritance
|
|
|
|
|
|
|
|
Kotlin style
|
|
|
|
|
|
|
|
```thp
|
2024-02-20 10:17:21 +00:00
|
|
|
class Animal(var String name)
|
2023-10-02 01:41:38 +00:00
|
|
|
{
|
2023-11-04 12:17:32 +00:00
|
|
|
pub fun say_name()
|
2023-10-02 01:41:38 +00:00
|
|
|
{
|
|
|
|
print($name)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class Cat(String name, Int lives) -> Animal(name)
|
|
|
|
|
|
|
|
Cat("Michi", 9).say_name()
|
|
|
|
```
|
|
|
|
|
2024-02-20 10:17:21 +00:00
|
|
|
## Mutable methods
|
|
|
|
|
|
|
|
By default methods cannot mutate the state of the object.
|
|
|
|
|
|
|
|
```thp
|
|
|
|
class Animal(var String name)
|
|
|
|
{
|
|
|
|
pub fun set_name(String new_name)
|
|
|
|
{
|
|
|
|
$name = new_name // Error: Cannot mutate $
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
To do so the method must be annotated. The caller must also
|
|
|
|
declare a mutable variable.
|
|
|
|
|
|
|
|
```thp
|
|
|
|
class Animal(var String name)
|
|
|
|
{
|
|
|
|
pub mut fun set_name(String new_name)
|
|
|
|
{
|
|
|
|
$name = new_name // Ok
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var michi = Animal("Michifu")
|
|
|
|
michi.set_name("Garfield")
|
|
|
|
```
|
2023-10-02 01:41:38 +00:00
|
|
|
|
|
|
|
|
|
|
|
|