Расширенное создание классов
При определении класса ему назначаются свойства, после чего определенный класс может наследовать от других классов. Свойства, который представляют собой члены класса, аналогичные полям, предоставляют более широкие возможности управления доступом к данным. Используя наследование, класс может расширить другой класс (или добавить к нему поведение).
Можно определить класс таким образом, чтобы экземпляры класса поддерживали свойства "expando". Это означает, что основанные на классе объекты могут содержать свойства и методы, которые динамически добавляются к этому объекту. Объекты, основанные на классах "expando", предоставляют некоторые функциональные возможности классов, основанных на прототипах.
Классы со свойствами
Для указания свойств в языке JScript используются операторы function get и function set. Можно указать один из этих методов доступа или оба метода для создания свойств, доступных только для чтения, только для записи или для чтения и записи. Однако свойства, доступные только для записи, используются крайне редко, и их наличие, скорее всего, указывает на конструктивные недостатки класса.
Вызывающая программа получает доступ к свойствам тем же способом, каким она получает доступ к полям. Главное отличие между свойствами и полями состоит в том, что для доступа к свойствам используются методы считывания и присвоения, тогда как доступ к полям осуществляется напрямую. Свойство позволяет классу проверять допустимость вводимых данных, отслеживать количество обращений к свойству для чтения или присвоения, возвращать динамические сведения и т. д.
Свойства обычно используются для доступа к закрытым или защищенным полям класса. Закрытые поля помечаются модификатором private, и доступ к ним могут получать только другие члены класса. Защищенные поля помечаются модификатором protected, и доступ к ним могут получать только другие члены данного класса или производных классов. Дополнительные сведения см. в разделе Модификаторы JScript.
В следующем примере свойства используются для доступа к защищенному полю. Поле является защищенным для того, чтобы запретить внешнему коду изменять его значение и одновременно разрешить производным классам получать к нему доступ.
class Person {
// The name of a person.
// It is protected so derived classes can access it.
protected var name : String;
// Define a getter for the property.
function get Name() : String {
return this.name;
}
// Define a setter for the property which makes sure that
// a blank name is never stored in the name field.
function set Name(newName : String) {
if (newName == "")
throw "You can't have a blank name!";
this.name = newName;
}
function sayHello() {
return this.name + " says 'Hello!'";
}
}
// Create an object and store the name Fred.
var fred : Person = new Person();
fred.Name = "Fred";
print(fred.sayHello());
Результаты выполнения данного кода следующие.
Fred says 'Hello!'
Если свойству Name назначается пустое имя, создается ошибка.
Наследование от классов
При определении класса, построенного на основе другого класса, используется ключевое слово extends. В языке JScript можно расширить большинство классов, совместимых со спецификацией CLS. Класс, определенный с помощью ключевого слова extends называется производным классом, а тот класс, который расширяется, называется базовым.
В данном примере определяется новый класс Student, который расширяет класс Person из предыдущего примера. Класс "Student" повторно использует свойство Name, определенное в базовом классе, и определяет новый метод sayHello, который переопределяет метод sayHello базового класса.
// The Person class is defined in the code above.
class Student extends Person {
// Override a base-class method.
function sayHello() {
return this.name + " is studying for finals.";
}
}
var mary : Person = new Student;
mary.Name = "Mary";
print(mary.sayHello());
Результаты выполнения данного кода следующие.
Mary is studying for finals.
Переопределение метода в производном классе не приводит к изменению соответствующего метода в базовом классе.
Объекты "expando"
Если необходимо определить только универсальный объект "expando", используйте конструктор Object.
// A JScript Object object, which is expando.
var o = new Object();
o.expando = "This is an expando property.";
print(o.expando); // Prints This is an expando property.
Если необходимо создать класс "expando", определите класс с модификатором expando. Доступ к членам expando можно получить только с помощью индексной нотации ([]); к ним нельзя получить доступ, используя нотацию с точкой (.).
// An expando class.
expando class MyExpandoClass {
function dump() {
// print all the expando properties
for (var x : String in this)
print(x + " = " + this[x]);
}
}
// Create an instance of the object and add some expando properties.
var e : MyExpandoClass = new MyExpandoClass();
e["answer"] = 42;
e["greeting"] = "hello";
e["new year"] = new Date(2000,0,1);
print("The contents of e are...");
// Display all the expando properites.
e.dump();
После выполнения этой программы выводится следующий результат:
The contents of e are...
answer = 42
greeting = hello
new year = Sat Jan 1 00:00:00 PST 2000