Неизменяемые интерфейсы почти эквивалентны константности.Вот пример:
interface CPoint {
function get x():Number;
function get y():Number;
}
class Point implements CPoint {
private var _x:Number;
private var _y:Number;
public function get x():Number { return _x; }
public function get y():Number { return _y; }
public function set x(val:Number) { _x = val; }
public function set y(val:Number) { _y = val; }
public function normalize():void {
var length:Number = Math.sqrt(_x*_x + _y*_y);
_x /= length;
_y /= length;
}
public function Point(x:Number, y:Number) {
_x = x; _y = y;
}
}
Если вы возвращаете Point в качестве ссылки CPoint, то ее поля не могут быть изменены.Вы можете сделать явное приведение к точке из CPoint для принудительного доступа, но вы можете сделать то же самое с константным приведением в C ++.
К сожалению, AS3 не поддерживает ковариацию, как должно, поэтомуизлишне сложно для const подобъектов.Например, если у вас был класс Line, состоящий из двух точек, вы можете сказать line.start.x = 47;
, если у вас есть полный доступ к линии, но разрешить чтение line.start.x
через неизменный интерфейс.Вы могли бы сделать это, если бы была ковариация, но вместо этого вам нужно будет добавить отдельные свойства get
для изменяемых и неизменяемых свойств.Таким образом, вместо этого вы получите line.cstart.x
для чтения из CLine.Примерно так:
interface CLine {
function get cstart():CPoint;
function get cend():CPoint;
}
class Line implements CLine {
private var _end:Point;
private var _start:Point;
public function get cend():CPoint { return _end; }
public function get cstart():CPoint { return _start; }
public function get end():Point { return _end; }
public function get start():Point { return _start; }
public function Line(x1:Number, y1:Number, x2:Number, y2:Number) {
_start = new Point(x1, y1);
_end = new Point(x2, y2);
}
}