thp-lang.org/md/learn/classes/definition.md

153 lines
2.0 KiB
Markdown
Raw Normal View History

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
{
// `$` 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
class Cat(
2024-02-20 10:17:21 +00:00
var String name,
var Int lives = 9,
val String surname = "Doe",
)
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
}
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