Руководство по actionscript. часть 1, стр. 087

Подобно переменным экземпляра, для создания статических переменных применяются описания переменных, размещаемые внутри класса, однако описание статической переменной должно также*включать атрибут static, как показано в следующем обобщенном коде:

class НекийКласс { static var идентификатор = значение;

}

Как и в случае с переменными экземпляра, для управления доступностью статических переменных в программе можно использовать модификаторы управления доступом. Такие модификаторы идентичны модификаторам, применяемым в описаниях переменных экземпляра, — public, internal, protected и private. Если в описании переменной никакой модификатор не задан, то используется модификатор internal (доступ внутри пакета). Указываемый модификатор обычно размещается перед атрибутом static, как показано в следующем коде:

class НекийКласс { private static var идентификатор = значение;

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

НекийКласс. идентификатор = значение;

Внутри класса, в котором объявлена данная переменная, имя идентификатор может использоваться и самостоятельно (без лидирующего имени класса и точки). Например, в классе А, в котором определена статическая переменная v, выражение А. v идентично выражению v. Тем не менее, чтобы различать статические переменные и переменные экземпляра, многие разработчики (это относится и к примерам данной книги) включают лидирующее имя класса даже в тех случаях, когда его использование не является обязательным.

Статические переменные и переменные экземпляра с одинаковыми именами могут сосуществовать внутри одного класса. Если в классе А определена переменная экземпляра v и статическая переменная с таким же именем, то при вызове в виде v идентификатор будет ссылаться на переменную экземпляра, а не на статическую переменную. Обратиться к статической переменной можно только путем указания лидирующего имени класса: А. v. В этом случае говорят, что переменная экземпляра затеняет статическую переменную.

Руководство по actionscript. часть 1, стр. 088

Теперь добавим несколько статических переменных в наш класс VirtualPet. Как известно, статические переменные используются для хранения информации, которая логически относится ко всему классу и не меняется от одного экземпляра к другому. В нашем классе VirtualPet уже есть два примера подобной информации: максимальная длина имени животного и максимальное количество калорий, которое может принять данное животное. Для хранения этой информации добавим две новые статические переменные: maxNameLength и maxCalories. Мы не будем обращаться к нашим переменным за пределами класса VirtualPet, поэтому объявим их с использованием модификатора доступа private. Следующий код демонстрирует объявления переменных maxNameLength и maxCalories, при этом оставшаяся часть кода класса VirtualPet опущена ради краткости:

package zoo { internal class VirtualPet { private static var maxNameLength = 20; private static var maxCalories = 2000;

// Оставшаяся часть класса не показана…

}

}

Теперь, когда у нас есть переменные maxNameLength и maxCalories, мы можем модифицировать методы getHunger ( ), еаt ( ) и setName ( ), чтобы воспользоваться этими переменными. В листинге 4.1 продемонстрирована последняя версия класса VirtualPet, в который были добавлены статические переменные. Изменения, внесенные в предыдущую версию кода, выделены полужирным шрифтом. Обратите внимание, что по соглашению статические переменные класса перечислены перед переменными экземпляра.

/

Статические переменные

117

Листинг 4.1. Класс VirtualPet

package zoo { internal class VirtualPet { private static var maxNameLength = 20; private static var maxCalories = 2000;

private var petName;

// Изначально каждому животному дается 50 % от максимально

// возможного количества калорий.

private var currentCalories = VirtualPet. maxCalories/2;

public function VirtualPet (name) { setName(name):

}

public function eat (numberOfCalories) { var newCurrentCalories = currentCalories + numberOfCalories; if (newCurrentCalories > VirtualPet. maxCalories) {

currentCalories = Virtual Pet. maxCalories; } else {

currentCalories = newCurrentCalories;

}

}

public function getHunger ( ) { return currentCalories / Virtual Pet. maxCalories;

}

public function setName (newName) { // Если длина заданного нового имени больше maxNameLength символов… if (newName. length > Virtual Pet. maxNameLength) { // …обрезать имя

newName = newName. substr(0. VirtualPet. maxNameLength); } else if (newName == «») { // …в противном случае, если заданное новое имя является // пустой строкой, завершить выполнение метода, не изменяя // значения переменной petName return;

}

// Присвоить новое проверенное имя переменной petName petName = newName;

}

public function getName ( ) { return petName;

}

}

Если проанализировать листинг 4.1, то можно заметить, что наличие переменных maxNameLength и maxCalories помогает централизовать код. Например,

ранее, чтобы изменить максимально допустимое количество символов в имени, нам пришлось бы заменить число 20 в двух местах тела метода setName — этот процесс не только отнимает много времени, но и может привести к ошибке. Теперь, чтобы изменить максимально допустимое количество символов, нужно просто присвоить другое значение переменной maxNameLength, и весь класс обновится автоматически.

Руководство по actionscript. часть 1, стр. 089

**4

Необъяснимые константные значения, как, например, число 20 в предыдущей версии метода setName(), называются «магическими значениями», поскольку они играют некую 3?«’ важную роль, однако их назначение неочевидно. Избегайте использования магических значений в своем коде. В большинстве случаев статические переменные могут применяться для хранения значений, которые в противном случае будут «магическими».

Статические переменные зачастую используются для хранения установочных параметров, значения которых не должны изменяться после запуска программы. Чтобы исключить возможность изменения значения переменной, ее нужно объявить константой, о чем и пойдет речь в следующем разделе.

Константы

Константа — это переменная экземпляра, статическая или локальная переменная, значение которой после инициализации остается постоянным вплоть до завершения программы. Для создания константы применяется стандартный синтаксис описания переменной, однако вместо ключевого слова var используется ключевое слово const. По соглашению имена констант полностью состоят из прописных букв. Чтобы создать константную статическую переменную, прямо в теле класса можно использовать следующий обобщенный код:

static const ИДЕНТИФИКАТОР = значение

Для создания константной переменной экземпляра прямо в теле класса можно указать следующий обобщенный код:

const ИДЕНТИФИКАТОР = значение

Чтобы создать константную локальную переменную, в теле метода или функции можно использовать следующий обобщенный код:

const ИДЕНТИФИКАТОР = значение

В трех предыдущих примерах кода ИДЕНТИФИКАТОР обозначает имя константы, а значение — начальное значение переменной. В случае с константными статическими и константными локальными переменными, после того как значение значение, указанное в инициализаторе переменной, будет присвоено переменной, изменить ее будет невозможно.

Руководство по actionscript. часть 1, стр. 090

При работе с константными переменными экземпляра, если программа откомпилирована в строгом режиме, после того как значение значение, указанное в инициализаторе переменной, будет присвоено переменной, изменить ее будет невозможно. Если программа откомпилирована в стандартном режиме, то после того,

как значение значение, указанное в инициализаторе переменной, будет присвоено переменной, изменить ее можно будет внутри функции конструктора того класса, в котором она объявлена, — после этого изменить значение переменной будет невозможно (различия между строгим и стандартным режимами компиляции будут рассмотрены в гл. 7).

Константы обычно используются для создания статических переменных, чьи фиксированные значения описывают варианты определенной настройки программы. Предположим, мы создаем программу будильника для ежедневной подачи сигнала. Подача сигнала может происходить в трех режимах: визуальном (моргающий значок), звуковом (зуммер) или визуальном и звуковом одновременно. Будильник представлен классом с именем AlarmClock. Для представления трех режимов подачи сигнала в классе Al armCl ос к определены три константные статические переменные: MODE_VISUAL, MODE_AUDIO и MODE_BOTH. Каждой константе присвоено числовое значение, определяющее соответствующий режим. Режим 1 считается визуальным, режим 2 — звуковым, а режим 3 — визуальным и звуковым одновременно. В следующем примере кода продемонстрированы описания констант режимов:

public class AlarmClock { public static const MODE_VISUAL = 1; public static const M0DE_AUDI0 = 2; public static const M0DE_B0TH = 3:

}

В классе AlarmClock определена переменная экземпляра mode, которая позволяет хранить информацию о выбранном режиме для каждого экземпляра этого класса. Чтобы задать режим для объекта AlarmClock, необходимо присвоить одно из константных значений режимов (1,2 или 3) переменной экземпляра mode. Следующий код устанавливает звуковой режим (режим 2) в качестве режима по умолчанию для новых объектов AlarmClock:

Руководство по actionscript. часть 1, стр. 091

Public class AlarmClock { public static const MODEJISUAL = 1; public static const M0DE_AUDI0 = 2; public static const M0DE_B0TH = 3;

private var mode = AlarmClock. M0DE_AUDI0;

}

Когда наступает время подачи сигнала, объект AlarmClock выполняет соответствующее действие в зависимости от текущего режима. Следующий код демонстрирует один из способов того, как объект AlarmClock мог бы использовать константы режимов для выбора подходящего действия:

public class AlarmClock { public static const MODEJISUAL = 1; public static const M0DE_AUDI0 = 2; public static const M0DE_B0TH = 3;

private var mode = AlarmClock. MODE_AUDIO;

private function signalAlarm ( ) { if (mode — MODEJISUAL) {

// Отобразить значок } else if (mode — M0DE_AUDI0) {

// Воспроизвести звук } else if (mode — M0DEB0TH) {

// Отобразить значок и воспроизвести звук

>

}

}

Обратите внимание, что в предыдущем коде использование констант режимов с технической точки зрения не является обязательным. Собственно говоря, мы могли бы решить эту задачу с помощью константных числовых значений (магических значений). Тем не менее при использовании констант назначение числовых значений становится гораздо более понятным. Для сравнения, следующий код демонстрирует класс AlarmClock, реализованный без констант. Обратите внимание, что без комментариев в коде определить назначение каждого из трех значений режимов было бы достаточно сложно:

public class AlarmClock { private var mode = 2;

private function signalAlarm ( ) { if (mode == 1) {

// Отобразить значок } else if (mode == 2) {

// Воспроизвести звук } else if (mode == 3) {

// Отобразить значок и воспроизвести звук

}

}

}

Теперь познакомимся с партнерами статических переменных — статическими методами.

Статические методы

В предыдущем разделе мы узнали, что статические переменные используются для хранения информации, которая относится ко всему классу. Подобным образом статические методы описывают функциональность, относящуюся ко всему классу, а не к отдельному экземпляру этого класса. Например, в состав API среды выполнения Flash входит класс Point, представляющий точку с координатами по оси X и по оси Y в декартовой системе координат. В классе Point определен статический метод polar ( ), который позволяет получить объект Point по заданной точке в полярной системе координат (то есть по расстоянию и углу). Преобразование точки в полярной системе координат в точку в декартовой системе координат является общей операцией, относящейся к точкам в декартовом пространстве вообще, а не к отдельному объекту Point. Именно поэтому данный метод определен как статический.

Статические методы

121

Как и методы экземпляра, статические методы создаются описанием функций внутри описаний классов, однако описания статических методов должны также включать атрибут static, как показано в следующем обобщенном коде:

class НекийКласс { static function имяМетода (идентификатор! = значение!,

идентификатор2 = значение2,

идентификатора = значениеп) {

}

}

Как и в случае с методами экземпляра, управлять доступностью статических методов в программе можно с помощью модификаторов управления доступом. В описаниях статических методов применяются те же модификаторы управления доступом, что и в описаниях методов экземпляра: public, internal, protectednprivate. Если при описании метода не указан никакой модификатор доступа, то используется модификатор internal (доступ внутри пакета). При описании статического метода модификатор доступа обычно размещается перед атрибутом static, как показано в следующем обобщенном коде:

Руководство по actionscript. часть 1, стр. 092

Class НекийКласс { public static function имяМетода (идентификатор! = значение!,

идентификатор2 = значение2

идентификаторп = значениеп) {

}

}

Для вызова статического метода используется следующий обобщенный код:

НекийКласс. имяМетода(значение1, значение2. ..значениеп)

В предыдущем коде НекийКласс обозначает класс, в котором определен статический метод, имяМетода — это имя статического метода, а значение!, значение2. . . значениеп — список, состоящий из нуля или более аргументов метода. Внутри класса, в котором определен данный метод, имя имяМетода может быть использовано самостоятельно (без лидирующего имени класса и точки). Например, в классе А, в котором определен статический метод т, выражение А. т ( ) идентично выражению m ( ). Тем не менее, чтобы различать статические методы и методы экземпляра, многие разработчики (это относится и к примерам данной книги) включают лидирующее имя класса[ даже в тех случаях, когда его использование не является обязательным.

Некоторые классы существуют только ради определения статических методов, объединяя связанную функциональность, однако экземпляры таких классов никогда не создаются. Например, собственный класс Mouse существует только ради определения статических методов show ( ) и hide ( ) (используются для отображения или скрытия указателя мыши). Обращение к этим статическим методам происходит непосредственно через класс Mouse (как, например, Mouse. hide ( ) ), а не через экземпляр данного класса. Объекты класса Mouse никогда не создаются.

У статических методов есть два ограничения, которые отсутствуют у методов экземпляра. Во-первых, в методе класса нельзя использовать ключевое слово this.

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

В целом, статические методы по сравнению со статическими переменными используются не часто. В нашей программе по созданию виртуального зоопарка статические методы не применяются вообще. Чтобы продемонстрировать применение статических методов на практике, вернемся к функции проверки адресов электронной почты, описанной в гл. 2. В этой функции мы создали цикл, который позволяет определить наличие или отсутствие символа @ в указанном адресе электронной почты. Теперь представим, что в результате активного развития нашего приложения было решено создать служебный класс для работы со строками. Назовем его StringUtils. Класс StringUtils не будет использоваться для создания объектов; он просто представляет коллекцию статических методов. В качестве примера мы определим один статический метод contains ( ), возвращающий значение типа Boolean — это значение определяет, содержит ли указанная строка выбранный символ. Рассмотрим код:

Руководство по actionscript. часть 1, стр. 093

Public class StringUtils { public function contains (string, character) { for (var i:int = 0; i <= string.length: i++) { if (string.charat(i) == character) { return true;

}

}

return false;

}

}

В следующем примере кода показано, как наше приложение могло бы использовать метод contains( ), чтобы проверить, содержит ли указанный адрес электронной почты символ @:

StringLIti 1 s. contains(«me@moock. org», «@»);

Конечно, в реальном приложении адрес электронной почты вводил бы сам пользователь и метод contains ( ) определял бы допустимость отправки формы на сервер. Следующий код демонстрирует более реалистичную ситуацию:

if (StringUtils. contains(userEmai1, «@»)) { // Этот код отправлял бы форму на сервер } else {

// Этот код отображал бы сообщение «Неправильные данные» для пользователя

}

Помимо статических методов, которые создаются вручную, среда выполнения Flash автоматически создает для каждого класса один статический метод, называемый инициализатором класса. Познакомимся с ним поближе.

Инициализатор класса. После определения класса на этапе выполнения программы среда Flash автоматически создает и исполняет метод, называемый инициализатором класса. В нем среда Flash размещает все инициализаторы статических

переменных данного класса и весь код уровня класса, не относящийся к описаниям переменных или методов.

Инициализатор класса предоставляет возможность выполнять однократные задачи настройки сразу после определения класса, вызывая методы или обращаясь к переменным, являющимся внешними по отношению к текущему классу. Предположим, что мы создаем приложение для чтения электронной почты и хотим, чтобы внешний вид этого приложения соответствовал графическому стилю операционной системы. Чтобы определить, какая графическая тема должна быть использована в почтовом клиенте, в инициализаторе основного класса приложения Mail Reader проверяется текущая операционная система и присваивается соответствующее значение статической переменной theme. Переменная theme хранит информацию о графической теме, используемой в данном приложении. В следующем коде продемонстрирован инициализатор для класса Mail Reader. Для проверки операционной системы в классе MailReader используется статическая переменная os, определенная всобственном классе flash, system. Capabilities.

package { import flash. system.*;

public class MailReader { static var theme; if (Capabilities. os == «MacOS») {

theme = «MAC»; } else if (Capabilities. os == «Linux») {

theme = «LINUX»; } else {

theme = «WINDOWS»;

}

}

}

Код, размещаемый в инициализаторе класса, выполняется в режиме интерпретации, и JIT-компилятор не компилирует его. Динамически откомпилированный код выполняется гораздо быстрее интерпретируемого кода, поэтому в тех случаях, когда на первом месте стоит вопрос производительности, код, интенсивно использующий ресурсы процессора, следует выносить за пределы инициализатора класса.

Объекты Class

Как мы уже знаем, обращение к каждому статическому методу и к каждой статической переменной осуществляется через класс, в котором они определены. Например, для обращения к статической переменной maxCalories, заданной в классе VirtualPet, мы применяем следующий код:

Virtual Pet. maxCalories

Использование имени класса VirtualPet в предыдущем коде является не просто особенностью синтаксиса; на самом деле имя класса VirtualPet ссылается

на объект, в котором определена переменная maxCalories. Объект, на который ссылается имя класса VirtualPet, является автоматически создаваемым экземпляром собственного класса Class.

Во время выполнения программы каждый класс в языке ActionScript представляется экземпляром класса Class. С точки зрения программиста, объекты Class используются в основном для доступа к статическим переменным и методам класса. Тем не менее, как и любые другие объекты, они являются значениями которые могут быть присвоены переменным, переданы или возвращены из методов и функций. Например, в следующей модифицированной версии нашегс класса VirtualPet переменной vp присваивается объект Class, представляющий класс VirtualPet, после чего эта переменная используется для создания объекта VirtualPet:

Руководство по actionscript. часть 1, стр. 094

Package zoo { public class VirtualZoo { private var pet;

public function VirtualZoo ( ) { var vp = VirtualPet; pet = new vpCStan»);

}

}

}

Описанная методика применяется в тех случаях, когда один SWF-файл желает обратиться к классам другого SWF-файла или когда мультимедийные элементы (например, изображения или шрифты) размещаются в другом SWF-файле. Обе описанные ситуации будут рассмотрены в части II.

Наше знакомство со статическими переменными и методами подошло к концу. Но перед тем, как перейти к следующей главе, сравним рассмотренные понятия с понятиями, применяемыми в языках С++ и Java.

Сравнение с терминологиями языков С++ и Java

Концепции переменных экземпляра, методов экземпляра, статических переменных и статических методов присутствуют в большинстве объектно-ориентированных языков программирования. Для сравнения в табл. 4.1 перечислены эквивалентные понятия, применяемые в языках Java и С++.

Таблица 4.1. Сравнение терминологий

ActionScript Java С++

Переменная экземпляра Поле или переменная экземпляра Член данных

Метод экземпляра Метод Функция-член

Статическая переменная Переменная класса Статический член данных

Статический метод Метод класса Статическая функция-член

К функциям

Как мы уже знаем, методы экземпляра определяют поведение, которое относится к отдельному объекту, а статические методы — поведение, относящееся к отдельному классу. В следующей главе мы познакомимся с функциями, которые определяют независимые поведения, не относящиеся ни к объектам, ни к классам.

ЩАМ S

Функции

Функция, или замыкание функции, — это дискретный набор инструкций, выполняющих определенную задачу независимо от других классов или объектов. Для описания и использования замыканий функций применяется такой же базовый синтаксис, как и для методов экземпляра и статических методов. Функции описываются с помощью ключевого слова function и вызываются с помощью оператора круглых скобок, при необходимости функции могут возвращать значение, а внутри тела могут определяться локальные переменные. Тем не менее, в отличие от методов экземпляра (которые всегда связаны с объектом) и статических методов (которые всегда связаны с классом), замыкания функций создаются и используются самостоятельно либо в виде подзадачи в методе, либо в виде полезной процедуры, доступной в пакете или в любом месте программы.

я л

Говоря на строгом профессиональном жаргоне спецификации языка ActionScript 3.0, м$ J, и замыкания функций, и методы являются разновидностями функций, при этом термин «функция» вообще относится к вызываемому объекту, представляющему собой набор инструкций. Таким образом, замыкание функции является функцией, не связанной с объектом или классом, а метод — функцией, связанной с объектом (в случае с методами экземпляра) или классом (в случае со статическими методами). Тем не менее в лексиконе программистов и в подавляющем большинстве документации вместо термина «замыкание функции» используется его сокращенный вариант — «функция». Если вы не читаете спецификацию языка ActionScript 3.0 или текст, в котором указано обратное, можете смело предполагать, что функция означает замыкание функции. В оставшейся части этой книги термин «функция» обозначает замыкание функции, если не указано другое.

Для создания функции используется следующий обобщенный код, размещаемый в одном из перечисленных мест: внутри метода, непосредственно внутри описания пакета, непосредственно за пределами описания пакета или внутри другой функции. Обратите внимание, что используемый для описания функции код идентичен коду, применяемому для описания обычного метода экземпляра. На самом деле, если следующий код размещается непосредственно внутри тела класса, создается метод экземпляра, а не функция.

Руководство по actionscript. часть 1, стр. 095

Function идентификатор (параметр!, параметр2… параметра) { }

В этом коде идентификатор обозначает имя функции, а параметр!, параметр2. . . параметра — необязательный список параметров функции, которые используются точно так же, как и параметры метода, рассмотренные в гл. 1. Фигурные скобки, следующие за списком параметров, определяют начало и конец тела функции, содержащего инструкции, выполняемые при ее вызове.

Для вызова функции применяется следующий обобщенный код:

функция (значение!, значение2. .. значениеп)

В данном коде функция обозначает имя вызываемой функции, а значение!, значе-ние2. . . значениеп — список аргументов, которые связаны по порядку с параметрами функции функция.

Функции уровня пакета

Чтобы функция была доступна в пакете или в любой точке программы, ее описание должно размещаться непосредственно внутри тела пакета. Чтобы ограничить доступ к функции только тем пакетом, в котором она описана, перед описанием функции нужно указать модификатор управления доступом internal, как показано в следующем коде:

package имяПакета { internal function идентификатор ( ) {

Чтобы функция была доступна в любой точке программы, перед описанием функции нужно указать модификатор управления доступом public, как показано в следующем коде:

package имяПакета { public function идентификатор ( ) {

Если никакой модификатор управления доступом не указан, то компилятор языка ActionScript автоматически использует модификатор internal.

3*4

Компиляторы, разработанные корпорацией Adobe, налагают два требования, затрагивающие функции уровня пакета, на исходные файлы (AS-файлы) программ, написанных Зу на языке ActionScript.

Каждый исходный файл (AS-файл) программы должен содержать только одно описание, видимое извне. Это может быть описание класса, переменной, функции, интерфейса или пространства имен, определенное внутри тела пакета либо с помощью модификатора internal, либо с помощью модификатора public.

Имя каждого исходного файла программы должно совпадать с именем единственного видимого извне описания, которое содержится в этом файле.

Таким образом, если теоретически язык ActionScript и не налагает никаких ограничений на функции уровня пакета, то на практике компиляторы, разработанные корпорацией Adobe, требуют, чтобы каждая функция уровня пакета была определена либо с помощью модификатора internal, либо с помощью модификатора public и размещена в отдельном AS-файле, имя которого должно совпадать с именем функции. Дополнительную информацию об ограничениях, налагаемых компиляторами, можно найти в разд. «Ограничения компиляторов» гл. 7.

Руководство по actionscript. часть 1, стр. 096

Следующий код создает функцию уровня пакета i sMa с ( ), возвращающую значение типа Boolean, которое указывает, является ли Macintosh текущей операционной

системой. Поскольку в описании функции i sMac ( ) указан модификатор управления доступом internal, эта функция будет доступна только внутри пакета utilities. Как было отмечено ранее, если для компиляции используется один из компиляторов, разработанных корпорацией Adobe, следующий код необходимо поместить в отдельный AS-файл с именем isMac. as.

package utilities { import flash. system.*;

internal function isMac ( ) { return Capabilities. os == «MacOS»;

}

}

Чтобы функция isMac ( ) была доступна за пределами пакета utilities, необходимо заменить модификатор internal модификатором public, как показано в следующем коде:

package utilities { import flash. system.*:

public function isMac ( ) { return Capabilities. os == «MacOS»:

}

}

Тем не менее, чтобы иметь возможность использовать функцию isMac ( ) за пределами пакета utilities, ее сначала необходимо импортировать. Предположим, что функция isMac ( ) является частью большой программы с классом Welcome, входящим в пакет setup. Чтобы воспользоваться этой функцией в классе Welcome, в исходный файл этого класса должна быть импортирована функция utilities. isMac ( ), как показано в следующем коде: package setup {

// Импортировать функцию isMac( ). чтобы ее можно было использовать // внутри тела этого пакета import utilities. isMac;

public class Welcome { public function Welcome ( ) { // Воспользоваться функцией isMac( ) if (isMac( )) { // Выполнить специфические для Macintosh действия

}

}

}

}

Глобальные функции. Функции, определенные на уровне пакета и размещаемые внутри пакета без имени, называются глобальными, поскольку обращаться к ним можно глобально, из любой точки программы без необходимости использования оператора import. Например, следующий код определяет глобальную функцию isLinux ( ). Поскольку функция is Linux ( ) находится внутри пакета без имени, к ней можно обращаться из любого места кода данной программы.



Полезные ссылки
Случайные записи
  • 07.03.2011">Руководство по actionscript. часть 4, стр. 103
  • 19.04.2012">Марк Цукерберг договорился о покупке Instagram за $1 млрд вместо $2 млрд
  • 18.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.105
  • 23.02.2011">Руководство по actionscript. часть 7, стр. 023
  • 03.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.60
  • 14.07.2011">Почему продвижение неизбежно
  • 11.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.15
  • 03.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.93
  • 04.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.13
  • 10.03.2011">Руководство по actionscript. часть 4, стр. 036
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.99
  • 25.07.2011">Прикольные статусы на каждый день
  • 26.02.2011">Руководство по actionscript. часть 6, стр. 075
  • 18.03.2011">Руководство по actionscript. часть 2, стр. 119
  • 08.07.2010">Секреты Фотошопа: «горячие» клавиши
Опрос

Какие цвета вы предпочитаете?

View Results

Loading ... Loading ...