Наследование классов

При объявлении, класс может наследовать (extends) один класс и реализовывать (implements) несколько классов или интерфейсов. Это значит, что он будет иметь несколько типов одновременно. Например:

    class D extends A, implements B, implements C {

    }
</div>

Получается, что каждый экземпляр класса D будет иметь тип D, но вы также сможете использовать его там, где требуются экземпляры A, B или С. Это значит, что каждый экземпляр D будет также иметь типы A, B и C.

===== Расширение (наследование) =====

Когда вы расширяете (extends) класс, ваш класс наследует все публичные и приватные не-статические поля. Поэтому вы можете использовать их в своём классе, как будто они были объявлены в нём. Также вы можете переопределить метод, заново описав его (для этого он должен иметь такое-же кол-во аргументов с теми же типами). Ваш класс не наследует статические поля.

Из переопределённого метода, вы всё ещё имеете доступ к методу суперкласса, используя super :

    class B extends A {
        function foo() : Int {
            return super.foo() + 1;
        }
    }
</div>

В конструкторе вашего класса вы можете вызывать конструктор суперкласса, также используя super :

    class B extends A {
        function new() {
            super(36,"");
        }
    }
</div>

===== Реализация =====

Если ваш класс реализует (implements) класс или интерфейс, ваш класс обязан реализовать все поля, объявленные или унаследованные реализуемым классом, с тем же типом и названием. При этом поле может уже быть унаследованным от суперкласса.

===== Интерфейсы =====

Интерфейсы это прототипы классов. Они объявляются с помощью ключевого слова interface. По умолчанию все поля интерфейсов являются публичными (public). Интерфейсы не могут иметь экземпляров.

    interface PointProto {
        var x : Int;
        var y : Int;

        function length() : Int;
        function add( p : PointProto ) : Void;
    }
</div>