I am pretty happy I managed to add the feature I was not able to while working on previous Skila — traits. Initially I thought about them as conditional methods:
class Greeter<T>
{
void hello(T &t) where T : ISay
{
t.say();
}
}
But when reading “Programming Rust” I noticed that syntax for Rust type implementations and this gave me the idea of decoupling those “conditional methods” from the main type:
class Greeter<T>
{
}
trait Greeter<T>
where T : ISay
{
void hello(T &t)
{
t.say();
}
}
It looks very much like extension method however you can spice it with inheritance:
class Greeter<T>
{
}
trait Greeter<T> : ISay
where T : ISay
{
void hello(T &t)
{
t.say();
}
// traits support polymorphism
override void say()
{
println("just saying");
}
}
Depending which type you pass when constructing Greeter it will inherit from ISay or not.
At this point there is a little zoo in Skila with similar features — protocols and interfaces, traits and extensions (upcoming) — and I hope some of them will be merged. Simplicity matters.