Статьи

Объекты

Теперь мы подошли к самому основному аспекту объектно-ориентированных языков программирования, таких как ManuScript, C++ или Java, который ставит их обособленно от традиционных языков подобных BASIC, Fortran или C. Переменные в традиционных языках могут содержать только определённые типы данных: целые числа, числа с плавающей точкой, строки и т.д. Над каждым типом данных можно производить специфические действия:
К примеру, числа можно умножать и делить, строки можно соединять вместе, преобразовывать из чисел и в них, искать в других строках и т.д. Но если ваша программа имеет дело с более сложными типами данных, как, например, даты (которые, в принципе, можно сравнивать, используя =, < и >, преобразовывать в строки и из строк и даже вычитать), вы должны представлять их самостоятельно.
Объектно-ориентированные языки могут манипулировать более сложными типами данных непосредственно. Таким образом, на ManuScript вы можете установить переменной, скажем, thischord значение аккорда из вашей партитуры и добавлять к ней больше нот:
thischord.AddNote(60); // добавить среднюю До (нота номер 60)
thischord.AddNote(64); // добавить Ми (нота номер 64)

[…]
На ManuScript Вы можете присваивать переменной значение аккорда, ноты из аккорда, такта, нотоносца или даже целой партитуры и делать с ними что-либо. Зачем имеется возможность присваивать переменной значение целой партитуры? Например, чтобы иметь возможность сохранить её или добавить к ней инструменты.

Объекты в действии
Через мгновение мы взглянем на то, как музыка представляется на ManuScript, а для начала давайте приспособим плагин Potato для создания партитуры:
x = 1;
text = ""; // начинаем без текста<br /> while (x<5)<br /> {<br />    if (not(x=4)) {<br />       text = text & x & " potato, "; // добавляем фразу
    } else {
      text = text & x & "."; // добавляем цифру 4
   }
   x = x+1;
}
Sibelius.New(); // создаём новую партитуру
newscore = Sibelius.ActiveScore; // помещаем её в переменную
newscore.CreateInstrument("Piano");
staff = newscore.NthStaff(1); // получаем верхний нотоносец
bar = staff.NthBar(1); // получаем 1 такт этого нотоносца
bar.AddText(0,text,"Technique"); // используем стиль текста Technique

Здесь создаётся партитура с инструментом фортепиано (Piano), и печатается текст песни в 1 такте, как текст технических указаний (Technique).
В этом коде несколько раз используется разделитель ‘.’, всегда в форме переменная.переменная или переменная.метод(). Это указывает, что переменная перед разделителем должна содержать объект.
• Если после разделителя стоит имя переменной, то мы получаем одну из подпеременных объекта (называемые ‘полями’ или ‘переменные-члены’ на некоторых языках). Например, если n – переменная, содержащая ноту, то n.Pitch – это число, представляющее её MIDI-звуковысотность (например, 60 для средней До), а n.Name – строка, описывающая её звуковысотность (например, ‘C4’ для средней До). Переменные, доступные для каждого типа объектов, перечислены ниже.
• Если после разделителя стоит имя метода (сопровождаемое () круглыми скобками), вызывается один из методов, позволенных для данного типа объектов. Обычно, методы, вызываемые этим способом, либо изменяют объект, либо возвращают какое-то значение. Например, если s – переменная, содержащая партитуру, то s.CreateInstrument(“Flute”) добавит к ней флейту (изменит партитуру), а s.NthStaff(1) возвратит значение, а именно объект, содержащий первый нотоносец.
Давайте подробней рассмотрим новый код. Предопределённая переменная с именем Sibelius содержит объект, представляющий саму программу Sibelius. Мы уже видели метод Sibelius.MessageBox(). Метод Sibelius.New() говорит Sibelius создать новую партитуру. Теперь, если мы хотим что-либо сделать с этой партитурой, мы должны поместить её в переменную.
К счастью, когда Вы создаёте новую партитуру, она становится активной (т.е. её строка заголовка выходит на первый план, а другие партитуры становятся неактивными), так что мы можем просто запросить у Sibelius активную партитуру и поместить её в переменную: newscore = Sibelius.ActiveScore.
Затем можно приказать партитуре создать фортепиано (Piano): newscore.CreateInstrument("Piano"). Но чтобы добавлять какой-либо текст к партитуре, Вы должны понять, как представлена её схема.