constructor: SingletonSet,
// Данное множество доступно только для чтения: методы add() и remove()
// возбуждают исключение
add: function() { throw "множество доступно только для чтения"; },
remove: function() { throw "множество доступно только для чтения"; },
// Экземпляры SingletonSet всегда имеют размер, равный 1
size: function() { return 1; },
// Достаточно вызвать функцию один раз и передать ей единственный элемент,
foreach: function(f, context) { f.call(context, this.member); },
// Метод contains() стал проще: такая реализация пригодна только
// для множества с единственным элементом
contains: function(x) { return х === this.member; }
});
Класс SingletonSet
имеет очень простую реализацию, состоящую из пяти простых методов. Этот класс не только реализует пять основных методов класса Set
, но и наследует от своего суперкласса такие методы, как toString(), toArray() и equals().
Возможность наследования методов является одной из основных причин определения подклассов. Метод equals()
класса Set
(определен в разделе 9.6.4), например, может сравнивать любые экземпляры класса Set
, имеющие методы size()
и foreach(),
с любыми экземплярами класса Set,
имеющими методы size()
и contains().
Поскольку класс SingletonSet
является подклассом класса Set
, он автоматически наследует его метод equals()
и не обязан иметь собственную реализацию этого метода. Безусловно, учитывая чрезвычайно упрощенную структуру множества, содержащего единственный элемент, можно было бы реализовать для класса SingletonSet
более эффективную версию метода equals():
SingletonSet.prototype.equals = function(that) {
return that instanceof Set && that.size()==1 && that.contains(this.member);
};
Обратите внимание, что класс SingletonSet
не просто заимствует список методов из класса Set
: он динамически наследует методы класса Set
. Если в Set.prototype
добавить новый метод, он тут же станет доступен всем экземплярам классов Set
и SingletonSet
(в предположении, что класс SingletonSet
не определяет собственный метод с таким же именем).
9.7.2. Вызов конструктора и методов базового класса
Класс SingletonSet
из предыдущего раздела определяет совершенно новый тип множеств и полностью переопределяет основные методы, наследуемые от суперкласса. Однако часто при определении подкласса необходимо лишь расширить или немного изменить поведение методов суперкласса, а не заменить их полностью. В этом случае конструктор и методы подкласса могут вызывать конструктор и методы базового класса.
Пример 9.13 демонстрирует применение этого приема. Он определяет подкласс NonNullSet
класса Set
: тип множеств, которые не могут содержать элементы со значениями null
и undefined
. Чтобы исключить возможность включения в множество таких элементов, класс NonNullSet
должен выполнить в методе add()
проверку значений добавляемых элементов на равенство значениям null
и undefined
. Но при этом не требуется включать в класс полную реализацию метода add()
- можно просто вызвать версию метода из суперкласса. Обратите также внимание, что конструктор NonNullSet()
тоже не реализует все необходимые операции: он просто передает свои аргументы конструктору суперкласса (вызывая его как функцию, а не как конструктор), чтобы конструктор суперкласса мог инициализировать вновь созданный объект.
Пример 9.13. Вызов из подкласса конструктора и метода базового суперкласса
/*
* NonNullSet - подкласс класса Set, который не может содержать элементы
* со значениями null и undefined.
*/
function NonNullSet() {
// Простое обращение к суперклассу.
// Вызвать конструктор суперкласса как обычную функцию для инициализации
// объекта, который был создан вызовом этого конструктора.
Set.apply(this, arguments);
Читать дальше
Конец ознакомительного отрывка
Купить книгу