При объявлении, класс может
наследовать (extends) один класс и
реализовывать (implements) несколько классов или интерфейсов. Это значит, что он будет иметь несколько
типов одновременно. Например:
class D extends A, implements B, implements C {
}
Получается, что каждый
экземпляр класса D будет иметь
тип D, но вы также сможете использовать его там, где требуются экземпляры A, B или С. Это значит, что каждый
экземпляр D будет также иметь типы A, B и C.
Расширение (наследование)
Когда вы расширяете (
extends) класс, ваш класс
наследует все
публичные и
приватные не-статические поля. Поэтому вы можете использовать их в своём классе, как будто они были объявлены в нём. Также вы можете
переопределить метод, заново описав его (для этого он должен иметь такое-же кол-во аргументов с теми же типами). Ваш класс не наследует
статические поля.
Из
переопределённого метода, вы всё ещё имеете доступ к методу
суперкласса, используя super :
class B extends A {
function foo() : Int {
return super.foo() + 1;
}
}
В конструкторе вашего класса вы можете вызывать конструктор суперкласса, также используя super :
class B extends A {
function new() {
super(36,"");
}
}
Реализация
Если ваш класс
реализует (implements) класс или интерфейс, ваш класс
обязан реализовать все поля,
объявленные или
унаследованные реализуемым классом, с тем же типом и названием. При этом поле может уже быть
унаследованным от суперкласса.
Интерфейсы
Интерфейсы это прототипы классов. Они объявляются с помощью ключевого слова interface. По умолчанию все поля интерфейсов являются
публичными (public). Интерфейсы не могут иметь экземпляров.
interface PointProto {
var x : Int;
var y : Int;
function length() : Int;
function add( p : PointProto ) : Void;
}