Шрифт:
function abstractmethod { throw new Error("абстрактный метод"); }
/*
* Класс AbstractSet определяет единственный абстрактный метод, contains.
*/
function AbstractSet {
throw new Error("Нельзя создать экземпляр абстрактного класса");
}
AbstractSet.prototype.contains = abstractmethod;
/*
* NotSet - конкретный подкласс класса AbstractSet.
* Элементами этого множества являются все значения, которые не являются
* элементами некоторого другого множества. Поскольку это множество
* определяется в терминах другого множества, оно не доступно для записи,
* а так как оно имеет бесконечное число элементов, оно недоступно для перечисления.
* Все, что позволяет этот класс, - это проверить принадлежность к множеству.
* Обратите внимание, что для определения этого подкласса используется метод
* Function.prototype.extendO, объявленный выше.
*/
var NotSet = AbstractSet.extend(
function NotSet(set) { this.set = set; },
{
contains: function(x) { return !this.set.contains(x); },
toString: function(x) { return "~" + this.set.toString; },
equals: function(that) {
return that instanceof NotSet && this.set.equals(that.set);
}
}
);
/*
* AbstractEnumerableSet - абстрактный подкласс класса AbstractSet.
* Определяет абстрактные методы size и foreach и реализует конкретные
* методы isEmptyO. toArrayO, to[Locale]String и equals.
* Подклассы, реализующие методы contains, size и foreach,
* получают эти пять конкретных методов даром.
*/
var AbstractEnumerableSet = AbstractSet.extend(
function {
throw new Error("Нельзя создать экземпляр абстрактного класса");
},
{
size: abstractmethod,
fоreach: abstractmethod,
isEmpty: function { return this.size == 0; },
toString: function {
var s = і = 0;
this.foreach(function(v) {
if (i++ > 0) s += ", ";
s += v;
});
return s +
},
toLocaleString : function {
var s = "{", і = 0;
this.foreach(function(v) {
if (i++ > 0) s += ", "
if (v == null) s += v; // null и undefined