The more I dive into implementing Skila the more I appreciate the role of the type system. Yet another interesting case is with generics — how to make them compile-once and be efficient for both complex and native types? Say, you would like to implement “Vector<T>
” — one operation which has to be executed is copying the value.
In C++ world you define template and when using it, given type appears viable (or not), however it goes with the price of compilation of each instantiation of the template. In C# you can specify constraint that “T
” has to inherit from something like “ICopyable
”. But native types do not inherit from anything, so how to make them fit into a template?
I noticed that generics supports object oriented programming, but is not dependent of it. So sure, you can express such constraint, but you can specify another one — making “T
” to provide all methods (or extension functions) declared in “ICopyable
”.
This makes type such as “Int
” fit for “Vector
”:
class Vector<T> where T : static ICopyable; ...
Note the keyword “static
”, “T
” is no longer checked against given inheritance, but against providing a set of methods.
The methods are checked when “Vector
” is instantiated, if you would like to make the code more explicit specify static inheritance when defining the class:
class Foo : static ICopyable ...
This does not add regular inheritance, instead it enforces the given suite of the methods when defining the class “Foo
”, not when calling for “Vector<Foo>
”.