Параметры класса

У класса может быть несколько параметров типа, с помощью которых можно добиваться расширяемого поведения класса. Например, класс Array имеет один параметр типа :

    class Array<T> {

        function new() {
            // ...
        }

        function get( pos : Int ) : T {
            // ...
        }

        function set( pos : Int, val : T ) : Void {
            // ...
        }
    }
</div>

Внутри класса Array, тип T является абстрактным и поэтому его поля и метода недоступны. Но когда вы объявляете массив вам нужно указать его тип : например Array<Int> или Array<String>. Это будет действовать также, как если бы вы заменили все типы T в объявлении Array на тип, который вы указали.

Параметр типа очень полезен для строгой типизации контейнеров таких как Array, List, Tree...
Вы можете определять свои собственные параметризованные классы с несколькими параметрами типа для собственного использования, когда вам это нужно.

===== Ограниченные параметры =====

Удобно иметь возможность определять абстрактные параметры, но также можно накладывать на них несколько ограничений для того, чтобы иметь возможность использовать их в реализации класса. Например:

    class EvtQueue<T : Event, EventDispatcher> {
        var evt : T;
        // ...
    }
</div>

Хотя полю evt в этом классе назначен тип его параметра, типизатор знает, что оно имеет оба типа - Event и EventDispatcher, поэтому он может получать к нему доступ, как если бы оно реализовывало оба класса. Позже, при создании EvtQueue, типизатор проверит расширяет(extends) или реализует(implements) параметр эти два типа - Event и EventDispatcher.

Ограничения параметров типов - очень мощный продвинутый функционал, который может быть действительно полезен для написания гибкого, универсального кода, подходящего для использования в разных приложениях.