Skip to content

Type System

In this guide, we will cover the standard type system in Vein.
Understanding the type system is crucial for writing robust and efficient code.
We will discuss classes, abstract classes, interfaces, structures, and related functionalities.

Constructors

Constructors are declared using the new keyword.

Syntax

vein
class Example {
    value: i32;

    // Default constructor
    new() {
        value = 0;
    }

    // Parameterized constructor
    new(i: i32) {
        value = i;
    }
}

In this example:

  • new() is the default constructor with no parameters.
  • new(i: i32) is a parameterized constructor that initializes the value field with the provided argument.

Classes

Classes are the fundamental building blocks in Vein. They can encapsulate data and behavior.

Example

vein
class Person {
   name: string;
   age: i32;

   new(name: string, age: i32) {
      this.name = name;
      this.age = age;
   }

   greet(): void {
      Out.println("Hello, my name is " + name + ".");
   }
}

auto person = Person("Alice", 30);
person.greet();  // Output: Hello, my name is Alice.

Object

Object is the base type of all classes. All classes implicitly inherit from Object.

Abstract Classes

Abstract classes cannot be instantiated directly. They are designed to be subclassed, and they can contain abstract methods that must be implemented by subclasses.

Example

vein
abstract class Animal {
   abstract makeSound(): void;

   move(): void {
      Out.println("The animal moves.");
   }
}

class Dog : Animal {
   makeSound(): void {
      Out.println("Woof!");
   }
}

auto dog = Dog();
dog.makeSound();  // Output: Woof!
dog.move();       // Output: The animal moves.

Interfaces experimental Currently interface feature has been disabled

Interfaces define a contract that implementing classes must fulfill. They can be inherited multiple times.

Example

vein
interface Drivable {
   drive(): void;
}

class Car : Drivable {
   drive(): void {
      Out.println("The car is driving.");
   }
}

auto car = Car();
car.drive();  // Output: The car is driving.

Structures

Structures are value types and can be used to encapsulate small data objects. Unlike classes, structures cannot be inherited.

Example

vein
struct Point : ValueType {
   x: i32;
   y: i32;
   
   new(x: i32, y: i32) {
      this.x = x;
      this.y = y;
   }

   display(): void {
      Out.println("Point(" + x + ", " + y + ")");
   }
}

auto point = Point(3, 4);
point.display();  // Output: Point(3, 4)

ValueType

ValueType is the base type of all structures. Structures are sealed and cannot be inherited.

Type Operators

typeof<T>()

The typeof<T>() operator returns information about the type T.

Example

vein
auto typeInfo = typeof<Person>();
Out.println(typeInfo);  // Output: Person

is<T>(value)

The is<T>(value) operator checks whether value is of type T or inherits from T.

Example

vein
auto person = Person("Alice", 30);
auto isPerson = is<Person>(person);

Out.println(isPerson);  // Output: true

Conclusion

Understanding the type system in Vein, including classes, abstract classes, interfaces, and structures, is key to writing effective programs. The Object and ValueType base types provide a foundation for all types in Vein, while operators like typeof<T>() and is<T>(value) offer powerful ways to work with types dynamically.