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

Ограниченная поддержка механизма наследования классов в JavaScript обеспечивается с помощью свойства prototype. Платформа ASP.NET AJAX обеспечивает дополнительный уровень абстракции. Механизм prototype поддерживается и для классов пространств имен, которые регистрируются с помощью метода ClassName.registerClass(). Во втором аргументе этого метода можно указать базовый класс. То есть можно задать, от какого класса порожден текущий класс.

Производные классы
Давайте попробуем создать класс, производный от класса Software. Броузеры являются одной из разновидностей программного обеспечения, поэтому создадим класс Browser. В дополнение к свойствам порождающего класса Software, броузеры должны обладать некоторыми дополнительными свойствами. Свойство isJavaScriptSupported может давать информацию о том, поддерживает ли данный броузер возможность исполнять сценарии на языке JavaScript.

OReilly.Browser = function(name, vendor, isJavaScriptSupported) {
//...
}

Ниже демонстрируется порядок регистрации класса. Обратите внимание на то, как новый класс (строковый параметр) наследует класс OReilly.Software (это уже не строка!).
OReilly.Browser.registerClass("OReilly.Browser", OReilly.Software);

Разумеется, можно было бы снова создать методы для доступа к свойствам name и vendor и написать программный код конструктора.


Но одно из преимуществ наследования (фактически, главное преимущество) состоит в том, что существует возможность повторного использования функциональности базового класса. Поскольку OReilly.Browser является наследником OReilly.Software, можно использовать уже имеющиеся методы получения и задания значений (то есть сами свойства), а также «частные» члены _name и _vendor. Нам только потребуется добавить методы доступа и частные члены для нового свойства isJavaScriptSup-ported, как показано ниже:

var _isJavaScriptSupported = (isJavaScriptSupported != null) ?
isJavaScriptSupported : false;
this.getIsJavaScriptSupported = function() {
return _isJavaScriptSupported;
}
this.setIsJavaScriptSupported = function(isJavaScriptSupported) {
_isJavaScriptSupported = isJavaScriptSupported;
}

Теперь все, что осталось сделать, – это написать конструктор. Но вместо того, чтобы снова писать его с самого начала, можно воспользоваться конструктором базового класса. Для этой цели ASP.NET AJAX предоставляет метод initializeBase(). В первом параметре этому мето ду передается экземпляр класса, для которого должен быть вызван конструктор базового класса – как правило, используется значение this.


Второй параметр – это массив аргументов для передачи конструктору базового класса (набор аргументов определяется базовым конструктором). В нашем случае этот массив будет содержать название броузера и производителя.

OReilly.Browser.initializeBase(this, new Array(name, vendor));

В примере 4.2 приводится программный код, который создает и использует новый производный класс Browser.
Пример 4.2. Использование механизма наследования ASP.NET AJAX ClientInheritance.aspx

<%@ Page Language="C#" %>
"http://www.w3.org/TR/xhtml1/DTD/xhtml1?transitional.dtd"> ASP.NET AJAX


(body)



(/body)


Доступ к методам базового класса
Когда речь заходит о наследовании классов, сам собой напрашивается вопрос – возможно ли перекрыть родительские методы в производном классе.


Ответ на этот вопрос – да. Следующий вопрос: существует ли возможность обратиться к аналогичным методам базового класса (то есть к перекрытым методам)? И снова ответ – да, платформа ASP.NET
AJAX позволяет делать это. Для демонстрации этих возможностей добавим в класс OReilly.Software метод toString(), который будет выводить названия продукта и производителя, хранящиеся в классе. Свойство prototype обеспечивает работу механизма наследования; оно же позволяет обращаться к методам базового класса.

OReilly.Software.prototype.toString = function() {
return this.getName() + " from " + this.getVendor();
}

В классе OReilly.Browser можно было бы реализовать похожий метод toString():
OReilly.Browser.prototype.toString = function() {
return this.getName() + " from " + this.getVendor() +
(this.getIsJavaScriptSupported() ? " (w/ JS)" : " (w/o JS)");
}

Однако снова было бы желательно повторно использовать имеющийся программный код, в данном случае – метод toString() базового класса.

Платформа ASP.NET AJAX предоставляет вспомогательный метод callBaseMethod(), который вызывает метод родительского класса. Этот метод принимает три аргумента:
instance
Экземпляр класса, для которого должен быть вызван метод базового класса (обычно значение this)
methodName
Имя метода (в виде строки)
baseArguments
Аргументы метода, если таковые имеются (в виде массива)

В данном случае метод toString() класса OReilly.Browser может быть реализован следующим образом:
OReilly.Browser.prototype.toString = function() {
return OReilly.Browser.callBaseMethod(this, "toString") +
(this.getIsJavaScriptSupported() ? " (w/ JS)" : " (w/o JS)");
}

Теперь можно сократить фрагмент сценария, который выводит информацию о броузерах, как показано ниже:

var s = "";
var ie = new OReilly.Browser("Internet Explorer", "Microsoft", true);
s = ie.toString() + "
";
var lynx = new OReilly.Browser("Lynx", null, false);
s += lynx.toString();
document.getElementById("output").innerHTML = s;

В примере 4.3 приводится полный листинг.
Пример 4.3. Доступ к методам базового класса
ClientBaseMethods.aspx
<%@ Page Language="C#" %>
"http://www.w3.org/TR/xhtml1/DTD/xhtml1?transitional.dtd"> ASP.NET AJAX


(body)
(asp:ScriptManager ID="ScriptManager1" runat="server")
(/asp:ScriptManager)


(/body)


Оцените статью: (0 голосов)
0 5 0

Статьи из раздела ASP.NET AJAX на эту тему:
Sys.StringBuilder
Интерфейсы
Клиентские версии классов .NET
Методы элементов DOM
Объектно-ориентированные возможности JavaScript в ASP.NET AJAX