Программная музыка. Пейзажная и сюжетная программность. Музыка плюс литература

Содержание которого раскрывает некую заложенную в него композитором словесную программу, очень часто поэтическую, - вот что такое программная музыка. Это явление придаёт ей специфические черты, отличающие ее от непрограммной, которые отображают настроения, чувства, душевные переживания человека. Программа может быть отражением каких угодно явлений действительности.

Конкретика и синтез

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

Единству литературы и музыки помогает то, что оба эти вида искусства способны показывать развитие и рост образа во времени. Различные виды творческих действий были объединены ещё с древности, поскольку искусство родилось и развивалось в синкретическом виде, связываясь с ритуалами и трудовой деятельностью. В средствах оно было очень ограниченным, поэтому по отдельности и без прикладных задач просто не могло существовать.

Размежевание

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

Это могут быть названия, которые предусматривает программная музыка. Примеры - в сборнике фортепианных пьес П. И. Чайковского где у каждой пьесы есть не только "говорящее", но и "рассказывающее" название: "Утренняя молитва", "Нянина сказка", "Болезнь куклы" и все остальные маленькие произведения. Это его же сборник для детей постарше "Времена года", где к названию Пётр Ильич присовокупил и яркий поэтический эпиграф. Композитор позаботился о конкретном содержании музыки, тем и объясняя, что такое программная музыка и как нужно исполнять данное произведение.

Музыка плюс литература

Программная музыка для детей особенно понятна, если у произведения есть и название, и сопроводительное слово, которое составляет сам композитор или писатель, вдохновивший его, как сделал Римский-Корсаков в симфонической сюите "Антар" по сказке Сенковского или Свиридов в музыке к повести

Тем не менее программа музыку лишь дополняет, не являясь точным разъяснением. Просто объект вдохновения один и тот же у писателя и композитора, а средства всё-таки разные.

Музыка минус литература

Если пьеса называется "Грустная песенка" (например, есть у Калинникова, Свиридова и многих других композиторов), это определяет только характер исполнения, но никак не конкретное содержание, тем и различны программная и непрограммная музыка. Конкретика - это "Собачка потерялась", "Клоуны", "Дедушкины часы" (которые потикают-потакают, а потом непременно будут бить). Такова практически вся программная музыка для детей, она глубже и быстрее понимается и лучше усваивается.

Музыкальный язык чаще всего сам конкретизирует программное содержание посредством своей изобразительности: звучание может имитировать пение птиц ("Жаровонок", "Кукушка"), нагнетание напряжённости, веселье народного гулянья, ярмарочные шумы ("Необычайное происшествие", "Масленица" и другие. Это так называемая звукопись, которая тоже проясняет, что такое программная музыка.

Определение

Любое снабжённое словесной характеристикой произведение обязательно содержит элементы программности, которая имеет множество видов. А что такое программная музыка, можно понять, даже слушая или разучивая этюды. Они сами по себе призваны развивать технические возможности музыканта в роли развёрнутых упражнений и могут не только программы не содержать, но и музыки как таковой, но всё равно зачастую носят в себе черты программности и даже бывают программны абсолютно. Но если в инструментальном произведении есть сюжет, и содержание последовательно раскрывается, это обязательно программная музыка. Примеры можно найти и в национальных народных, и в классических сочинениях.

"Три кита" и национальные черты в программе

Также помогают понять, что такое программная музыка, определённые черты прикладных ("Полюшко", например), марша во всём жанровом разнообразии ("Марш Черномора" и "Марш деревянных солдатиков"), а также танца - народного, классического, фантастического. Это, с лёгкой руки Д.Б. Кабалевского, в музыке - "три кита", определяющие жанровую принадлежность.

Характерные черты национальной музыки тоже обычно служат программности музыкального произведения, задавая общую концепцию, темп, ритм сочинения ("Танец с саблями" Хачатуряна, например, "Два еврея..." и "Гопак" Мусоргского).

Пейзажная и сюжетная программность

Отображение одного или ряда образов, которые на протяжении всего сочинения не претерпевают изменений, - тоже программная музыка. Примеры произведений можно найти повсеместно: "В полях" Глиэра, "По скалам и фьордам" Грига и так далее. Сюда же можно отнести картины праздников и битв, музыкальные изображения пейзажные и портретные.

Даже одни и те же литературные сюжеты композиторы воплощают в музыке по-разному: например, "Ромео и Джульетта" Шекспира у Чайковского вылилась в увертюру, где программность обобщённая, а у Берлиоза - последовательная. И то, и другое, разумеется, программная музыка. Название чаще всего может рассматриваться как сюжетная программа, например "Битва гуннов" Листа по одноимённой фреске Каульбаха или его же этюды "Хоровод гномов" и "Шум леса". Иногда произведения скульптуры, архитектуры, живописи помогают понять, что такое программная музыка, поскольку участвуют в выборе изобразительных средств для музыкальной картины.

Вывод

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

Поэтому многие композиторы от программности пытались отказываться (в том числе Малер, Чайковский, Штруаус и другие), но, несмотря на это, полностью непрограммной музыки ни у одного из них не получилось. Единство музыки и конкретики её содержания никогда не является нерасторжимым и абсолютным. И чем более обобщённо отражается содержание, тем лучше для слушателя. Что такое программная музыка - станет понятно по малейшим штрихам развития музыкальной мысли: имеющий уши, так сказать, услышит, несмотря на то что единое определение и даже одинаковое понимание этого явления в музыке в среде музыкальных теоретиков пока не появилось.

Обобщённое программирование Обобщенное программирование - написание кода, который может быть многократно использован с объектами многих различных типов.

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

Обобщённое программирование — парадигма программирования, заключающаяся в таком описании данных и алгоритмов, которое можно применять к различным типам данных, не меняя само это описание. В том или ином виде поддерживается разными языками программирования.

Обобщения (generics) представляют собой наиболее существенное изменение в языке программирования Java со времен версии 1.0. Появление обобщений в Java 5.0 стало результатом первых требований к спецификации Java (Java Specification Requests — JSR 14), которые были сформулированы в 1999 г. Обобщения понадобились потому, что они позволяют писать более безопасный код, который легче читается, чем код, перегруженный переменными Object и приведениями типов. Обобщения особенно полезны для классов коллекций, таких как вездесущий ArrayList.

Обобщения похожи — по крайней мере, внешне — на шаблоны в C++. В C++, как и в Java, шаблоны впервые были добавлены для поддержки строго типизированных кол- лекций. Однако с годами были открыты и другие их применения.

Возможности обобщённого программирования впервые появились в 70-х годах в языках CLU и Ada, а затем во многих объектно-ориентированных языках, таких как C++, Java, D и языках для платформы.NET. Общий механизм Средства обобщённого программирования реализуются в виде тех или иных синтаксических средств. У функции или типа данных явно описываются формальные параметры-типы. Это описание является обобщённым и в исходном виде непосредственно использовано быть не может.

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

Естественно, что для успешного использования обобщённых описаний фактические типы-параметры должны удовлетворять определённым условиям. Если обобщённая функция сравнивает значения типа-параметра, любой конкретный тип, использованный в ней, должен поддерживать операции сравнения, если присваивает значения типа-параметра переменным — конкретный тип должен обеспечивать корректное присваивание. Способы реализации Известно два основных способа реализации поддержки обобщённого программирования в компиляторе.

Порождение нового кода для каждой конкретизации. В этом варианте компилятор рассматривает обобщённое описание как текстовый шаблон для создания вариантов конкретизаций. Когда компилятору требуется новая конкретизация обобщённого типа или процедуры, он создаёт новый экземпляр типа или процедуры, чисто механически добавляя туда тип-параметр. То есть, имея обобщённую функцию перестановки элементов, компилятор, встретив её вызов для целого типа, создаст функцию перестановки целых чисел и подставит в код её вызов, а затем, встретив вызов для строкового типа — создаст функцию перестановки строк, никак не связанную с первой. Этот метод обеспечивает максимальное быстродействие. Недостатком его является то, что при активном использовании обобщённых типов и функций с различными типами-параметрами размер откомпилированной программы может очень сильно возрастать, поскольку даже для тех фрагментов описания, которые для разных типов не различаются, компилятор всё равно генерирует отдельный код. Этот недостаток можно затушевать путём частичной генерации общего кода (часть обобщённого описания, которая не зависит от типов-параметров, оформляется специальным образом и по ней компилятор генерирует единый для всех конкретизаций код). . Порождение кода, который во время исполнения выполняет преобразование фактических параметров-типов к одному типу, с которым фактически и работает. В этом случае на этапе компиляции программы компилятор лишь проверяет соответствие типов и включает в код команды преобразования конкретного типа-параметра к общему типу. Код, определяющий функционирование обобщённого типа или функции, имеется в откомпилированной программе в единственном экземпляре, а преобразования и проверки типов выполняются динамически, во время работы программы. В этом варианте порождается, как правило, более компактный код, но программа оказывается в среднем медленнее, чем в первом варианте, из-за необходимости выполнения дополнительных операций и меньших возможностей оптимизации. Кроме того, в компилированный код для типов-параметров далеко не всегда включается динамическая информация о типах (в первом варианте она есть, если вообще поддерживается, поскольку конкретизации для каждого типа-параметра различны), что определяет некоторые ограничения на применение обобщённых типов и функций. Подобные ограничения есть в Java.

Обобщенный класс - это класс с одной или более переменной типа. class Pair {} Переменная типа используется для спецификации типа возрата методов и типов полей и локальных переменных. Затем можно создать обьект обобщенного типа, подставляя имя типа вместо переменной типа. Pair ()

Некоторые ограничения на обобщения 1. Параметры типа не могут принимать примитивные типы. 2. Массивы параметризованных типов не разрешены. 3. Нельзя создавать экземпляры переменных типов. 4. В статическом контексте не разрешены. Назначение обобщенного программирования Обобщенное программирование означает написание кода, который может быть многократно использован с объектами многих различных типов. Это облегчает чтение вашего кода. Вы можете сразу понять, что этот конкретный массив-список содержит объекты String. Компилятор также может успешно использовать эту информацию. Не требуется никакого приведения при вызове get(). Компилятор знает, что типом возврата этого метода является String, а не Object: String filename = files.get(0); Компилятор также знает, что метод add() в ArrayList имеет параметр типа String. Это намного безопаснее, чем иметь дело с параметром типа Object. Теперь компилятор может проконтролировать, чтобы вы не вставили объект неверного типа. Например, следующий оператор не скомпилируется: files.add(new File("...")); // в ArrayList можно добавлять // только объекты String Ошибка компиляции — это намного лучше, чем исключение приведения типа во время выполнения. В этом привлекательность параметров типа: они делают вашу программу легче читаемой и более безопасной. Такие обобщенные классы, как ArrayList, использовать легко. И большинство программистов Java просто применяют типы вроде ArrayList — как если бы они были частью языка, подобно массивам String. (Разумеется, массивы-списки лучше простых массивов, поскольку могут автоматически расширяться.) Однако реализовать обобщенный класс не так просто. Программисты, которые будут использовать ваш код, попытаются подставлять всевозможные классы вместо ваших параметров типа. Они ожидают, что все будет работать без досадных ограничений и запутанных сообщений об ошибках. Ваша задача как обобщенного программиста — предвидеть все возможные будущие применения вашего класса. Обобщенный код и виртуальная машина Виртуальная машина не имеет дела с объектами обобщенных типов — все объекты принадлежат обычным классам. Всякий раз при определении обобщенного типа автоматически создается соответствующий ему “сырой” (raw) тип. Имя этого типа совпадает с именем обобщенного типа с удаленными параметрами типа. Переменные типа удаляются и заменяются ограничивающими типами (или типом Object, если переменная не имеет ограничений). Например, “сырой” тип для Pair выглядит, как показано ниже. public class Pair { public Pair(Object first, Object second) { this.first = first; this.second = second; } public Object getFirst() { return first; } public Object getSecond() { return second; } public void setFirst(Object newValue) { first = newValue; } public void setSecond(Object newValue) { second = newValue; } private Object first; private Object second; } Поскольку T — неограниченная переменная типа, она просто заменяется Object. В результате получается обычный класс вроде тех, что вы могли реализовать раньше, до появления средств обобщений в язык программирования Java. Ваши программы содержат разные варианты Pair, такие как Pair или Pair, но такая “подчистка” превращает их в “сырой” тип Pair. “Сырой” тип заменяет переменные типов первым ограничением или же Object, если никаких ограничений не предусмотрено. Например, переменная типа в классе Pair не имеет явных ограничений, а потому сырой тип заменяет T на Object. Предположим, что объявлен немного отличающийся тип: public class Interval implements Serializable { public Interval(T first, T second) { if (first.compareTo(second) <= 0) { lower = first; upper = second; } else { lower = second; upper = first; } } ... private T lower; private T upper; } Сырой тип Interval выглядит следующим образом: public class Interval implements Serializable { public Interval(Comparable first, Comparable second) { ... } ... private Comparable lower; private Comparable upper; } Трансляция обобщенных выражений Когда ваша программа вызывает обобщенный метод, компилятор вставляет приведения, когда удаляется возвращаемый тип. Например, рассмотрим следующую последовательность операторов: Pair buddies = ...; Employee buddy = buddies.getFirst(); Подчистка getFirst() приведет к возврату типа Object. Компилятор автоматически вставит приведение к Employee. То есть компилятор транслирует вызов метода в две инструкции виртуальной машины. . Вызов сырого метода Pair.getFirst(). . Приведение возвращенного объекта Object к типу Employee. Приведения также вставляются при обращении к обобщенному полю. Предположим, что поля first и second были бы общедоступными, т.е. public. (Возможно, это нехороший стиль программирования, но вполне допустимый в Java.) Тогда в оператор Employee buddy = buddies.first; в результирующем байт-коде также будут вставлены приведения.

Средства обобщённого программирования реализуются в языках программирования в виде тех или иных синтаксических средств, дающих возможность описывать данные (типы данных) и алгоритмы (процедуры, функции, методы), параметризуемые типами данных. У функции или типа данных явно описываются формальные параметры-типы. Это описание является обобщённым и в исходном виде непосредственно использовано быть не может.

В тех местах программы, где обобщённый тип или функция используется, программист должен явно указать фактический параметр-тип, конкретизирующий описание. Например, обобщённая процедура перестановки местами двух значений может иметь параметр-тип, определяющий тип значений, которые она меняет местами. Когда программисту нужно поменять местами два целых значения, он вызывает процедуру с параметром-типом «целое число» и двумя параметрами - целыми числами, когда две строки - с параметром-типом «строка» и двумя параметрами - строками. В случае с данными программист может, например, описать обобщённый тип «список» с параметром-типом, определяющим тип хранимых в списке значений. Тогда при описании реальных списков программист должен указать обобщённый тип и параметр-тип, получая, таким образом, любой желаемый список с помощью одного и того же описания.

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

Способы реализации

Известно два основных способа реализации поддержки обобщённого программирования в компиляторе.

  • Порождение нового кода для каждой конкретизации. В этом варианте компилятор рассматривает обобщённое описание как текстовый шаблон для создания вариантов конкретизаций. Когда компилятору требуется новая конкретизация обобщённого типа или процедуры, он создаёт новый экземпляр типа или процедуры, чисто механически добавляя туда тип-параметр. То есть, имея обобщённую функцию перестановки элементов, компилятор, встретив её вызов для целого типа, создаст функцию перестановки целых чисел и подставит в код её вызов, а затем, встретив вызов для строкового типа - создаст функцию перестановки строк, никак не связанную с первой. Этот метод обеспечивает максимальное быстродействие, поскольку варианты конкретизаций становятся разными фрагментами программы, каждый из них может быть оптимизирован для своего типа-параметра, к тому же в код не включаются никакие лишние элементы, связанные с проверкой или преобразованием типов на этапе исполнения программы. Недостатком его является то, что при активном использовании обобщённых типов и функций с различными типами-параметрами размер откомпилированной программы может очень сильно возрастать, поскольку даже для тех фрагментов описания, которые для разных типов не различаются, компилятор всё равно генерирует отдельный код. Этот недостаток можно затушевать путём частичной генерации общего кода (часть обобщённого описания, которая не зависит от типов-параметров, оформляется специальным образом и по ней компилятор генерирует единый для всех конкретизаций код). Зато данный механизм даёт естественную возможность создания специальных (обычно - сильно вручную оптимизированных) конкретизаций обобщённых типов и функций для некоторых типов-параметров.
  • Порождение кода, который во время исполнения выполняет преобразование фактических параметров-типов к одному типу, с которым фактически и работает. В этом случае на этапе компиляции программы компилятор лишь проверяет соответствие типов и включает в код команды преобразования конкретного типа-параметра к общему типу. Код, определяющий функционирование обобщённого типа или функции, имеется в откомпилированной программе в единственном экземпляре, а преобразования и проверки типов выполняются динамически, во время работы программы. В этом варианте порождается, как правило, более компактный код, но программа оказывается в среднем медленнее, чем в первом варианте, из-за необходимости выполнения дополнительных операций и меньших возможностей оптимизации. Кроме того, в компилированный код для типов-параметров далеко не всегда включается динамическая информация о типах (в первом варианте она есть, если вообще поддерживается, поскольку конкретизации для каждого типа-параметра различны), что определяет некоторые ограничения на применение обобщённых типов и функций. Подобные ограничения есть, например, в Java.

Обобщённое программирование в языках

C++

В языке C++ обобщённое программирование основывается на понятии «шаблон», обозначаемом ключевым словом template . Широко применяется в стандартной библиотеке C++ (см. STL), а также в сторонних библиотеках boost , Александр Степанов.

В качестве примера приведём обобщённую функцию, возвращающую большее значение из двух.

// Описание шаблонной функции template T max(T x, T y) { if (x < y) return y; else return x; } ... // Применение шаблонной функции int a = max(10 ,15 ) ; ... double f = max(123.11 , 123.12 ) ; ...

Java

Java предоставляет средства обобщённого программирования, синтаксически основанные на C++, начиная с версии J2SE 5.0. В этом языке имеются generics или «контейнеры типа T» - подмножество обобщённого программирования.

.NET

Пример на

D

В языке «D» средства обобщённого программирования значительно эволюционировали в сравнении с С++, как в процедурной, так и в объектно ориентированной составляющей. Значительно проще стало и лингвистическое представление.

Пример рекурсивной генерации на основе шаблонов D:

// http://digitalmars.com/d/2.0/template.html template Foo(T, R...) // T - тип, R - набор типов { void Foo(T t, R r) { writefln(t) ; static if (r.length ) // if more arguments Foo(r) ; // do the rest of the arguments } } void main() { Foo(1 , "a" , 6.8 ) ; } /+++++++++++++++ prints: 1 a 6.8 +++++++++++++++/


Wikimedia Foundation . 2010 .

Смотреть что такое "Обобщенное программирование" в других словарях:

    обобщенное программирование - — [Е.С.Алексеев, А.А.Мячев. Англо русский толковый словарь по системотехнике ЭВМ. Москва 1993] Тематики информационные технологии в целом EN generalized programmingGP … Справочник технического переводчика

    Modern C++ Design

    Эту статью следует викифицировать. Пожалуйста, оформите её согласно правилам оформления статей. Условные обозначения … Википедия

    У этого термина существуют и другие значения, см. C. См. также: Си (язык программирования) C++ Семантика: мультипарадигмальный: объектно ориентированное, обобщённое, процедурное, метапрограммирование Тип исполнения: компилируемый Появился в … Википедия

    У этого термина существуют и другие значения, см. D. D Семантика: мультипарадигменный: императивное, объектно ориентированное, обобщённое программирование Тип исполнения: компилятор Появился в: 1999 Автор(ы) … Википедия

    См. также: Си (язык программирования) C++ Семантика: мультипарадигмальный: объектно ориентированное, обобщённое, процедурное, метапрограммирование Тип исполнения: компилируемый Появился в: 1985 г. Автор(ы): Бьёрн Страуструп … Википедия

    У этого термина существуют и другие значения, см. F (значения). Правильный заголовок этой статьи F#. Он показан некорректно из за технических ограничений. F# Класс языка: мультипарадигменный: функциональное, объектно ориентированное,… … Википедия

    Этим сочетанием символов также часто обозначают аккорд или тональность Фа диез мажор F♯ это функциональный язык программирования общего назначения. Разработан Доном Саймом (англ. Don Syme) в Microsoft Research в Кембридже. Структура F♯ во многом… … Википедия

    F# это функциональный язык программирования общего назначения. Разработан Доном Саймом (англ. Don Syme) в Microsoft Research в Кембридже. Структура F# во многом схожа со структурой библиотек и среды исполнения.NET. Некоторые задачи решаются… … Википедия

    У этого термина существуют и другие значения, см. Loki (значения). Библиотека Loki для языка программирования C++ написана Андреем Александреску как часть книги «Современное проектирование на С++: Обобщенное программирование и прикладные шаблоны… … Википедия

Книги

  • Программирование. Принципы и практика с использованием C++ , Страуструп Бьярне. Эта книга не является учебником по языку C++, это учебник по программированию. Несмотря на то что ее автор - автор языка С++, книга не посвящена этому языку программирования; он играет в…

нем. Programmusik, франц. musique а programme, итал. musica a programma, англ. programme music

Музыкальные произведения, имеющие определённую словесную, нередко поэтич. программу и раскрывающие запёчатлённое в ней содержание. Явление муз. программности связано со специфич. чертами музыки, отличающими её от др. иск-в. В области отображения чувств, настроений, душевной жизни человека музыка имеет важные преимущества перед др. иск-вами. Косвенно, через чувства и настроения, музыка способна отразить мн. явления действительности. Однако она не в состоянии точно обозначить, что именно вызывает в человеке то или иное чувство, не способна достигнуть предметной, понятийной конкретности отображения. Возможностями такой конкретизации обладают речевой язык, литература. Стремясь к предметной, понятийной конкретизации, композиторы создают программные муз. произв.; предпосылая соч. программу, они заставляют средства речевого языка, художеств. лит-ры действовать в единстве, в синтезе с собственно муз. средствами. Единению музыки и лит-ры способствует и то, что они являются иск-вами временными, способными показывать рост, развитие образа. Единение разл. иск-в происходило издавна. В глубокой древности вообще не существовало самостоят. видов иск-в - они выступали вместе, в единстве, иск-во было синкретическим; одноврем. оно было тесно связано с трудовой деятельностью и с разл. рода ритуалами, обрядами. В эту пору каждое из иск-в было столь ограничено в средствах, что вне синкретич. единства, направленного на решение прикладных задач, существовать не могло. Последующее выделение иск-в определялось не только изменением бытового уклада, но и ростом возможностей каждого из них, достигнутым внутри синкретич. единства, связанным с этим ростом эстетич. чувства человека. В то же время единение иск-в никогда не прекращалось, включая и единение музыки со словом, поэзией - прежде всего во всевозможных вок. и вок.-драматич. жанрах. В нач. 19 в., после длительного периода существования музыки и поэзии как самостоятельных иск-в, тенденция к их единению ещё более усилилась. Это определялось уже не их слабостью, а скорее их силой, доведением до предела их собств. возможностей. Дальнейшее обогащение отображения действительности во всём её многообразии, во всех её аспектах могло быть достигнуто лишь совместным действием музыки и слова. И программность является одним из видов единения музыки и средств речевого языка, а также лит-ры, обозначающих или отображающих те стороны единого объекта отражения, передать к-рые своими собственными средствами музыка не в состоянии. Т. о., неотъемлемым элементом программного муз. произв. является словесная программа, созданная или избранная самим композитором, - будь то краткий программный заголовок, указывающий на явление действительности, к-рое имел в виду композитор (пьеса "Утро" Э. Грига из музыки к драме Г. Ибсена "Пер-Гюнт"), порой же "отсылающий" слушателя к определённому лит. произв. ("Макбет" Р. Штрауса - симф. поэма "по драме Шекспира"), или пространный отрывок из литературного произв., подробная программа, составленная композитором по тому или иному лит. произв. (симф. сюита (2-я симфония) "Антар" Римского-Корсакова по одноимённой сказке О. И. Сенковского) или вне связи с к.-л. лит. прообразом ("Фантастическая симфония" Берлиоза).

Не всякое заглавие, не всякое пояснение к музыке могут рассматриваться как её программа. Программа может исходить только от автора музыки. Если он не сообщил программы, значит сам его замысел был непрограммным. Если он сначала придал своему соч. программу, а потом отказался от неё, значит он перевёл своё соч. в разряд непрограммных. Программа не является разъяснением музыки, она дополняет её, раскрывая нечто отсутствующее в музыке, недоступное для воплощения муз. средствами (иначе она была бы излишней). Этим она принципиально отличается от любого анализа музыки непрограммного соч., любого описания его музыки - хотя бы и самого поэтичного, в т.ч. и от описания, принадлежащего автору соч. и указывающего на конкретные явления, к-рые вызвали в его творч. сознании те или иные муз. образы. И наоборот - программные соч. - это не "перевод" на язык музыки самой программы, но отражение муз. средствами того же объекта, к-рый обозначен, отражён в программе. Программой не являются и приданные самим автором заголовки, если они обозначают не конкретные явления действительности, но понятия эмоционального плана, к-рые музыка передаёт гораздо точнее (напр., заголовки типа "Грусть" и т.п.). Случается, что программа, приданная произв. самим автором, не находится в органич. единстве с музыкой, однако это определяется уже художеств. мастерством композитора, порой и тем, насколько удачно составлена или подобрана им словесная программа. К вопросу о существе явления программности это прямого отношения не имеет.

Определёнными средствами конкретизации обладает сам муз. язык. В их числе муз. изобразительность (см. Звукопись) - отражение различного рода звучаний действительности, ассоциативные представления, порождаемые муз. звуками - их высотой, длительностью, тембром. Важным средством конкретизации является также привлечение черт "прикладных" жанров - танцевальных, марша во всех его разновидностях и т.п. Конкретизации могут служить и нац.-характерные черты муз. языка, муз. стиль. Все эти средства конкретизации позволяют и без обращения к программности выражать общую концепцию соч. (напр., торжество светлых сил над тёмными и т.п.). И всё же они не дают той предметной, понятийной конкретизации, к-рая обеспечивается словесной программой. Более того, чем шире применены в муз. произв. собственно муз. средства конкретизации, тем более необходимыми для полноценного восприятия музыки оказываются слова, программа.

Один из видов программности - картинная программность. К нему относятся соч., отображающие один образ или комплекс образов действительности, не претерпевающий существ. изменений на протяжении всего его восприятия. Это картины природы (пейзажи), картины нар. празднеств, плясок, битв и т.п., муз. изображения отд. объектов неодушевлённой природы, а также портретные муз. зарисовки.

Второй осн. вид муз. программности - сюжетная программность. Источником сюжетов для программных произв. этого вида служит прежде всего художеств. лит-ра. В сюжетно-программном муз. произв. развитие муз. образов в целом или в частностях отвечает развитию сюжета. Различают программность обобщённо-сюжетную и последовательно- сюжетную. Автор соч., относящегося к обобщённо-сюжетному типу программности и связанного через программу с тем или иным лит. произв., не ставит целью показать обрисованные в нём события во всей их последовательности и сложности, но даёт муз. характеристику осн. образов лит. произв. и общего направления развития сюжета, исходного и итогового соотношения действующих сил. Напротив, автор произв., принадлежащего к последовательно-сюжетному типу программности, стремится отобразить и промежуточные этапы развития событий, порой всю последовательность событий. Обращение к этому типу программности диктуется сюжетами, в к-рых важное значение приобретают и срединные этапы развития, протекающего не прямолинейно, но связанного с введением новых персонажей, с изменением обстановки действия, с событиями, не являющимися непосредственным следствием предшествующей ситуации. Обращение к последовательно-сюжетной программности зависит и от творч. установок композитора. У разных композиторов одни и те же сюжеты зачастую претворяются по-разному. Напр., трагедия "Ромео и Джульетта" У. Шекспира вдохновила П. И. Чайковского на создание произв. обобщённо-сюжетного типа программности (увертюра-фантазия "Ромео и Джульетта"), Г. Берлиоза - на создание произв. последовательно-сюжетного типа программности (драм. симфония "Ромео и Джульетта", в к-рой автор даже выходит за пределы чистого симфонизма и привлекает вок. начало).

В области муз. языка невозможно установить отличит. признаки П. м. Это справедливо и в отношении формы программных произв. В соч., представляющих картинный тип программности, нет никаких предпосылок для возникновения специфич. структур. Задачи, к-рые ставят перед собой авторы программных произв. обобщённо-сюжетного типа, с успехом выполняются формами, выработанными в непрограммной музыке, в первую очередь формой сонатного allegro. Авторам программных соч. последовательно-сюжетного типа приходится создавать муз. форму, в большей или меньшей мере "параллельную" сюжету. Но строят они её, комбинируя элементы разл. форм непрограммной музыки, привлекая нек-рые широко представленные уже в ней приёмы развития. В их числе - вариационный метод. Он позволяет показывать изменения, не затрагивающие существа явления, касающиеся мн. важных черт, но сопряжённые с сохранением ряда качеств, что даёт возможность узнать образ, в каком бы новом облике он ни выступал. С вариационным методом тесно связан принцип монотематизма. Используя этот принцип в плане образной трансформации, столь широко применявшейся Ф. Листом в его симфонических поэмах и др. произв., композитор обретает большую свободу следования за сюжетом без опасности нарушить муз. цельность соч. Другой вид монотематизма, связанный с лейтмотивной характеристикой персонажей (см. Лейтмотив), находит применение гл. обр. в последовательно-сюжетных произв. Зародившись в опере, лейтмотивная характеристика была перенесена и в область инстр. музыки, где одним из первых и наиболее широко к ней прибегал Г. Берлиоз. Суть её заключается в том, что одна тема на протяжении всего соч. выступает как характеристика одного и того же героя. Она появляется каждый раз в новом контексте, обозначающем окружающую героя новую обстановку. Тема эта может меняться и сама, но изменения в ней не меняют её "предметного" смысла и отражают лишь перемены в состоянии того же героя, изменение представлений о нём. Приём лейтмотивной характеристики наиболее уместен в условиях цикличности, сюитности и оказывается мощным средством объединения контрастных частей цикла, раскрывающих единый сюжет. Облегчает воплощение в музыке последовательно-сюжетных замыслов и объединение в одночастной форме черт сонатного allegro и сонатно-симф. цикла, характерное для созданного Ф. Листом жанра симф. поэмы. Разл. этапы действия передаются с помощью относительно самостоят. эпизодов, контраст между к-рыми отвечает контрасту частей сонатно-симф. цикла, затем эти эпизоды "приводятся к единству" в сжатой репризе, причём в соответствии с программой выделяется тот или иной из них. С точки зрения цикла реприза обычно соответствует финалу, с точки зрения сонатного allegro 1-й и 2-й эпизоды отвечают экспозиции, 3-й ("скерцо" в цикле) - разработке. У Листа применение подобных синтетич. форм нередко сочетается с использованием принципа монотематизма. Все эти приёмы позволяли композиторам создавать муз. формы, отвечающие индивидуальным чертам сюжета и вместе с тем органичные и целостные. Однако новые синтетич. формы не могут считаться принадлежностью одной лишь программной музыки. Они возникли не только в связи с воплощением программных замыслов - в их появлении сказались и общие тенденции эпохи. Точно такие же структуры постоянно использовались и в непрограммной музыке.

Встречаются программные муз. соч., в к-рых в качестве программы привлекаются произв. живописи, скульптуры, даже архитектуры. Таковы, напр., симф. поэмы Листа "Битва гуннов" по фреске В. Каульбаха И "От колыбели до могилы" по рисунку М. Зичи, его же пьесы "Часовня Вильгельма Телля"; "Обручение" (к картине Рафаэля), "Мыслитель" (по статуе Микеланджело) из фп. циклов "Годы странствий" и др. Однако возможности предметной, понятийной конкретизации у этих иск-в не являются исчерпывающими. Не случайно живописные и скульптурные произв. снабжаются конкретизирующим названием, к-рое может рассматриваться как своеобразная их программа. Поэтому в муз. произв., написанных по тем или иным творениям изобразит, иск-в, по существу объединяются не только музыка и живопись, музыка и скульптура, но музыка, живопись и слово, музыка, скульптура и слово. И функции программы в них выполняет гл. обр. не произв. изобразит, иск-ва, но словесная программа. Это определяется прежде всего разноплановостью музыки как временного иск-ва и живописи и скульптуры как иск-в статичных, "пространственных". Что же касается архитектурных образов, они вообще неспособны конкретизировать музыку в предметно-понятийном плане; авторы муз. произв., связанных с архитектурными памятниками, как правило, вдохновлялись не столько ими самими, сколько история, событиями, разыгравшимися в них или вблизи них, легендами, к-рые о них сложились (пьеса "Вышеград" из симф. цикла Б. Сметаны "Моя родина", упомянутая выше фп. пьеса "Часовня Вильгельма Телля" Листа, к-рой автор не случайно предпослал эпиграф "Один за всех, все за одного").

Программность явилась большим завоеванием муз. иск-ва. Она обусловила обогащение круга образов действительности, находящих отражение в муз. произв., поиски новых выразит. средств, новых форм, способствовала обогащению и дифференциации форм и жанров. Обращение композитора к П. м. обычно определяется его связью с жизнью, с современностью, вниманием к актуальным проблемам, в др. случаях само способствует сближению композитора с действительностью, более глубокому её постижению. Однако кое в чём П. м. уступает музыке непрограммной. Программа суживает восприятие музыки, отвлекает внимание от выраженной в ней общей идеи. Воплощение сюжетных замыслов обычно сопряжено с муз. характеристиками, отличающимися большей или меньшей условностью. Отсюда двойственное отношение многих великих композиторов к программности, к-рая и притягивала их, и отталкивала (высказывания П. И. Чайковского, Г. Малера, Р. Штрауса и др.). П. м. не является неким: высшим родом музыки, как не является им и музыка непрограммная. Это равноправные, одинаково правомерные разновидности. Различие между ними не исключает их связи; оба рода связаны и с вок. музыкой. Так, колыбелью программного симфонизма были опера и оратория. Оперная увертюра явилась прототипом программной симф. поэмы; в оперном искусстве лежат и предпосылки лейтмотивизма и монотематизма, столь широко применяющихся в П. м. В свою очередь непрограммная инстр. музыка испытывает влияние вок. музыки и П. м. Найденные в П. м. новые выразит. возможности становятся достоянием и непрограммной музыки. Общие тенденции эпохи сказываются на развитии как П. м., так и непрограммной музыки.

Единство музыки и программы в программном соч. не является абсолютным, нерасторжимым. Случается, что программа не доводится до слушателя при исполнении соч., что лит. произв., к к-рому автор музыки отсылает слушателя, оказывается ему незнакомым. Чем более обобщённую форму избирает композитор для воплощения своего замысла, тем меньший ущерб восприятию нанесёт подобный "отрыв" музыки произведения от его программы. Такой "отрыв" всегда нежелателен, если речь идёт об исполнении совр. произведений. Однако он может оказаться и закономерным, когда речь идёт об исполнении произв. более ранней эпохи, поскольку программные замыслы с течением времени могут утратить прежнюю актуальность, значимость. В этих случаях муз. произв. в большей или меньшей степени утрачивают черты программности, превращаются в непрограммные. Т. о., грань между П. м. и музыкой непрограммной, вообще совершенно чёткая, в историч. аспекте условна.

П. м. развивалась по существу на протяжении всей истории проф. муз. иск-ва. Самое раннее из найденных исследователями сообщений о программных муз. соч. относится к 586 до н.э. - в этом году на пифийских играх в Дельфах (Др. Греция) авлетист Сакао исполнил пьесу Тимосфена, изображавшую битву Аполлона с драконом. Немало программных соч. было создано и в последующее время. В их числе - клавирные сонаты "Библейские истории" лейпцигского композитора И. Кунау, клавесинные миниатюры Ф. Куперена и Ж. Ф. Рамо, клавирное "Каприччо на отъезд возлюбленного брата" И. С. Баха. Представлена программность и в творчестве венских классиков. Среди их соч.: триада программных симфоний Й. Гайдна, характеризующих разл. времена суток (No 6, "Утро"; No 7, "Полдень"; No 8, "Вечер"), его же "Прощальная симфония"; "Пасторальная симфония" (No 6) Бетховена, все части к-рой снабжены программными подзаголовками и на партитуре к-рой значится пометка, важная для понимания типа программности у автора соч. - "Более выражение чувств, чем изображение", его же пьеса "Битва при Виттории", первоначально предназначавшаяся для механич. муз. инструмента пангармоникона, но затем исполнявшаяся в орк. редакции, и особенно его увертюры к балету "Творения Прометея", к трагедии "Кориолан" Коллина, увертюры "Леонора" No 1-3, увертюра к трагедии "Эгмонт" Гёте. Написанные как вступления к драм. или муз.-драм. произв., они вскоре же обрели самостоятельность. Позднее программные соч. также нередко создавались в качестве вступлений к к.-л. лит. произв., с течением времени утрачивая, однако, свои вступит. функции. Подлинный расцвет П. м. наступил в эпоху муз. романтизма. Сравнительно с представителями классицистской и даже просветительской эстетики художники-романтики глубже понимали специфику разл. иск-в. Они видели, что каждое из них отображает жизнь по-своему, используя свойственные только ему средства и отражая тот же предмет, явление с определённой, доступной ему стороны, что, следовательно, каждое из них в чём-то ограничено и даёт неполную картину действительности. Именно это привело художников-романтиков к мысли о синтезе иск-в ради более полного, многостороннего отображения мира. Муз. романтики провозгласили лозунг обновления музыки с помощью её связи с поэзией, нашедший претворение во мн. муз. произв. Программные соч. занимают важное место в творчестве Ф. Мендельсона-Бартольди (увертюра из музыки к "Сну в летнюю ночь" Шекспира, увертюры "Гебриды", или "Фингалова пещера", "Морская тишь и счастливое плавание", "Прекрасная Мелузина", "Рюи Блаз" и др.), Р. Шумана (увертюры к "Манфреду" Байрона, к сценам из "Фауста" Гёте, мн. фп. пьесы и циклы пьес и др.). Особенно большое значение П. м. приобретает у Г. Берлиоза ("Фантастическая симфония", симфония "Гарольд в Италии", драм. симфония "Ромео и Джульетта", "Траурно-триумфальная симфония", увертюры "Уиверли", "Тайные судьи", "Король Лир", "Роб Рой" и др.) и Ф. Листа (симфония "Фауст" и симфония к "Божественной комедии" Данте, 13 симф. поэм, мн. фп. пьесы и циклы пьес). В последующее время важный вклад в развитие П. м. внесли Б. Сметана (симф. поэмы "Ричард III", "Лагерь Валленштейна", "Гакон Ярл", цикл "Моя родина" из 6 поэм), А. Дворжак (симф. поэмы "Водяной", "Золотая прялка", "Лесной голубь" и др., увертюры - Гуситская, "Отелло" и др.) и Р. Штраус (симф. поэмы "Дон Жуан", "Смерть и просветление", "Макбет", "Тиль Уленшпигель", "Так говорил Заратустра", фантастич. вариации на рыцарскую тему "Дон Кихот", "Домашняя симфония" и др.). Программные соч. создавали также К. Дебюсси (орк. прелюдия "Послеполуденный отдых фавна", симф. циклы "Ноктюрны", "Море" и др.), М. Регер (4 симф. поэмы по Бёклину), А. Онеггер (симф. поэма "Песнь Нигамона", симф. движения "Пасифик 231", "Регби" и др.), П. Хиндемит (симфонии "Художник Матис", "Гармония мира" и др.).

Богатое развитие программность получила в рус. музыке. Для рус. нац. муз. школы обращение к программности диктовалось эстетич. установками её ведущих представителей, их стремлением к демократичности, общепонятности своих соч., а также "объективным" характером их творчества. От сочинений, осн. на песенных темах и потому заключающих в себе элементы синтеза музыки и слова, поскольку слушатель при их восприятии соотносит с музыкой тексты соответств. песен ("Камаринская" Глинки), рус. композиторы вскоре же пришли к собственно П. м. Ряд выдающихся программных соч. создали члены "Могучей кучки" - М. А. Балакирев (симф. поэма "Тамара"), М. П. Мусоргский ("Картинки с выставки" для фп.), Н. А. Римский-Корсаков (симф. картина "Садко", симфония "Антар"). Немалое число программных произв. принадлежит П. И. Чайковскому (1-я симфония "Зимние грёзы", симфония "Манфред", увертюра-фантазия "Ромео и Джульетта", симф. поэма "Франческа да Римини" и др.). Яркие программные произв. написали и А. К. Глазунов (симф. поэма "Стенька Разин"), А. К. Лядов (симф. картины "Баба-Яга", "Волшебное озеро" и "Кикимора"), Вас. С. Калинников (симф. картина "Кедр и пальма"), С. В. Рахманинов (симф. фантазия "Утёс", симф. поэма "Остров мёртвых"), А. Н. Скрябин (симф. "Поэма экстаза", "Поэма огня" ("Прометей"), мн. фп. пьесы).

Программность широко представлена и в творчестве сов. композиторов, в т.ч. С. С. Прокофьева ("Скифская сюита" для оркестра, симф. эскиз "Осеннее", симф. картина "Сны", фп. пьесы), Н. Я. Мясковского (симф. поэмы "Молчание" и "Аластор", симфонии No 10, 12, 16 и др.), Д. Д. Шостаковича (симфонии No 2, 3 ("Первомайская"), 11 ("1905 год"), 12 ("1917 год") и др.). Программные соч. создаются и представителями более молодых поколений сов. композиторов.

Программность свойственна не только профессиональному, но и нар. муз. иск-ву. У народов, муз. культуры к-рых включают развитое инстр. музицирование, оно связано не только с исполнением и варьированием песенных мелодий, но и с созданием независимых от песенного иск-ва сочинений, б.ч. программных. Так, программные соч. составляют значит.часть казах. (кюи) и кирг. (кю) инстр. пьес. Каждая из таких пьес, исполняемая солистом-инструменталистом (у казахов - кюйши) на одном из нар. инструментов (домбра, кобыз или сыбызга у казахов, комуз и др. у киргизов), имеет программное заглавие; мн. из этих пьес стали традиционными, подобно песням передаваясь в разл. вариантах от поколения к поколению.

Важный вклад в освещение явления программности внесли сами композиторы, работавшие в этой области, - Ф. Лист, Г. Берлиоз и др. В последующее время, несмотря на исследования, прояснившие нек-рые частные вопросы, заруб. музыковедение не только не продвинулось вперёд в понимании явления П. м., но скорее отдалилось от него. Показательно, напр., что авторы статей о П. м., помещённых в крупнейших зап.-европ. муз. энциклопедиях и долженствующих обобщить опыт исследования проблемы, дают явлению программности очень расплывчатые определения (см. Grovйs Dictionary of music and musicians, v. 6, L.-N. Y., 1954; Riemann Musiklexikon, Sachteil, Mainz, 1967), порой же вообще отказываются от к.-л. определений (Die Musik in Geschichte und Gegenwart. Allgemeine Enzyklopдdie der Musik, Bd 10, Kassel u. a., 1962).

В России изучение проблемы программности началось ещё в период деятельности рус. классич. муз. школы, представители к-рой оставили важные высказывания по этому вопросу. Внимание к проблеме программности особенно усилилось в сов. время. В 1950-е гг. на страницах журн. "Советская музыка" и газ. "Советское искусство" прошла спец. дискуссия по вопросу о муз. программности. Эта дискуссия выявила и расхождения в понимании явления П. м. Высказывались, напр., мысли о "программности в строгом смысле слова" и в широком понимании термина, о программности "объявленной" и "необъявленной", о программности "для себя" (композитора) и для слушателей, о программности "осознанной" и "неосознанной", о программности в непрограммной музыке и др. Существо всех этих высказываний сводится к признанию возможности П. м. без программы, приданной соч. самим композитором. Подобная точка зрения неизбежно приводит к отождествлению программности с содержательностью, к объявлению программной всей музыки, к оправданию "отгадывания" необъявленных программ, т.е. произвольного истолкования композиторских замыслов, против к-рого всегда резко выступали сами композиторы. В 50-60-е гг. появилось немало работ, которые внесли определённый вклад в разработку проблем программности, в частности в область разграничения видов П. м. Однако единое понимание явления программности ещё не установилось.

Литература: Чайковский П. И., Письма к H. P. фон-Мекк от 17 февраля/1 марта 1878 и 5/17 декабря 1878, в кн.: Чайковский П. И., Переписка с Н.Ф.фон-Мекк, т. 1, М.-Л., 1934, то же, Полн. собр. соч., т. VII, М., 1961 с. 124-128, 513-514; его же, О программной музыке, М.-Л., 1952; Кюи Ц. A., Русский романс. Очерк его развития, СПБ, 1896, с. 5; Ларош, Нечто о программной музыке, "Мир искусства", 1900, т. 3, с. 87-98; его же, Предисловие переводчика к книге Ганслика "О музыкально-прекрасном", Собр. муз.-критич. статей, т. 1, М., 1913, с. 334-61; его же, Один из противников Ганслика, там же, с. 362-85; Стасов В. В., Искусство в XIX веке, в кн.: XIX век, СПБ, 1901, то же, в его кн.: Избр. соч., т. 3, М., 1952; Ястребцев В. В., Мои воспоминания о Н. А. Римском-Корсакове, вып. 1, П., 1917, Л., 1959, с. 95; Шостакович Д., О подлинной и мнимой программности, "СМ", 1951, No 5; Бобровский В. П., Сонатная форма в русской классической программной музыке, М., 1953 (автореферат дисс.); Сабинина М., Что такое программная музыка?, "МЖ", 1959, No 7; Арановский М., Что такое программная музыка?, М., 1962; Tюлин Ю. Н., О программности в произведениях Шопена, Л., 1963, М., 1968; Хохлов Ю., О музыкальной программности, М., 1963; Ауэрбах Л., Рассматривая проблемы программности, "СМ", 1965, No 11. См. также лит. при статьях Эстетика музыкальная, Музыка, Звукопись, Монотематизм, Симфоническая поэма.

Последнее обновление: 28.09.2017

C выходом версии 2.0 фреймворк.NET стал поддерживать обобщенные типы (generics), а также создание обобщенных методов. Чтобы разобраться в особенности данного явления, сначала посмотрим на проблему, которая могла возникнуть до появления обобщенных типов. Посмотрим на примере. Допустим, мы определяем класс для представления банковского счета. К примеру, он мог бы выглядеть следующим образом:

Class Account { public int Id { get; set; } public int Sum { get; set; } }

Класс Account определяет два свойства: Id - уникальный идентификатор и Sum - сумму на счете.

Здесь идентификатор задан как числовое значение, то есть банковские счета будут иметь значения 1, 2, 3, 4 и так далее. Однако также нередко для идентификатора используются и строковые значения. И у числовых, и у строковых значений есть свои плюсы и минусы. И на момент написания класса мы можем точно не знать, что лучше выбрать для хранения идентификатора - строки или числа. Либо, возможно, этот класс будет использоваться другими разработчиками, которые могут иметь свое мнение по данной проблеме.

И на первый взгляд, чтобы выйти из подобной ситуации, мы можем определить свойство Id как свойство типа object. Так как тип object является универсальным типом, от которого наследуется все типы, соответственно в свойствах подобного типа мы можем сохранить и строки, и числа:

Class Account { public object Id { get; set; } public int Sum { get; set; } }

Затем этот класс можно было использовать для создания банковских счетов в программе:

Account account1 = new Account { Sum = 5000 }; Account account2 = new Account { Sum = 4000 }; account1.Id = 2; account2.Id = "4356"; int id1 = (int)account1.Id; string id2 = (string)account2.Id; Console.WriteLine(id1); Console.WriteLine(id2);

Все вроде замечательно работает, но такое решение является не очень оптимальным. Дело в том, что в данном случае мы сталкиваемся с такими явлениями как упаковка (boxing) и распаковка (unboxing) .

Так, при присвоении свойству Id значения типа int, происходит упаковка этого значения в тип Object:

Account1.Id = 2; // упаковка в значения int в тип Object

Чтобы обратно получить данные в переменную типов int, необходимо выполнить распаковку:

Int id1 = (int)account1.Id; // Распаковка в тип int

Упаковка (boxing) предполагает преобразование объекта значимого типа (например, типа int) к типу object. При упаковке общеязыковая среда CLR обертывает значение в объект типа System.Object и сохраняет его в управляемой куче (хипе). Распаковка (unboxing), наоборот, предполагает преобразование объекта типа object к значимому типу. Упаковка и распаковка ведут к снижению производительности, так как системе надо осуществить необходимые преобразования.

Кроме того, существует другая проблема - проблема безопасности типов. Так, мы получим ошибку во время выполнения программы, если напишем следующим образом:

Account account2 = new Account { Sum = 4000 }; account2.Id = "4356"; int id2 = (int)account2.Id; // Исключение InvalidCastException

Мы можем не знать, какий именно объект представляет Id, и при попытке получить число в данном случае мы столкнемся с исключением InvalidCastException.

Эти проблемы были призваны устранить обобщенные типы. Обобщенные типы позволяют указать конкретный тип, который будет использоваться. Поэтому определим класс Account как обощенный:

Class Account { public T Id { get; set; } public int Sum { get; set; } }

Угловые скобки в описании class Account указывают, что класс является обобщенным, а тип T, заключенный в угловые скобки, будет использоваться этим классом. Необязательно использовать именно букву T, это может быть и любая другая буква или набор символов. Причем сейчас нам неизвестно, что это будет за тип, это может быть любой тип. Поэтому параметр T в угловых скобках в еще называется универсальным параметром , так как вместо него можно подставить любой тип.

Например, вместо параметра T можно использовать объект int, то есть число, представляющее номер счета. Это также может быть объект string, либо или любой другой класс или структура:

Account account1 = new Account { Sum = 5000 }; Account account2 = new Account { Sum = 4000 }; account1.Id = 2; // упаковка не нужна account2.Id = "4356"; int id1 = account1.Id; // распаковка не нужна string id2 = account2.Id; Console.WriteLine(id1); Console.WriteLine(id2);

Поскольку класс Account является обобщенным, то при определении переменной после названия типа в угловых скобках необходимо указать тот тип, который будет использоваться вместо универсального параметра T. В данном случае объекты Account типизируется типами int и string:

Account account1 = new Account { Sum = 5000 }; Account account2 = new Account { Sum = 4000 };

Поэтому у первого объекта account1 свойство Id будет иметь тип int, а у объекта account2 - тип string.

При попытке присвоить значение свойства Id переменной другого типа мы получим ошибку компиляции:

Account account2 = new Account { Sum = 4000 }; account2.Id = "4356"; int id1 = account2.Id; // ошибка компиляции

Тем самым мы избежим проблем с типобезопасностью. Таким образом, используя обобщенный вариант класса, мы снижаем время на выполнение и количество потенциальных ошибок.

Значения по умолчанию

Иногда возникает необходимость присвоить переменным универсальных параметров некоторое начальное значение, в том числе и null. Но напрямую мы его присвоить не можем:

T id = null;

В этом случае нам надо использовать оператор default(T) . Он присваивает ссылочным типам в качестве значения null, а типам значений - значение 0:

Class Account { T id = default(T); }

Статические поля обобщенных классов

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

Class Account { public static T session; public T Id { get; set; } public int Sum { get; set; } }

Теперь типизируем класс двумя типами int и string:

Account account1 = new Account { Sum = 5000 }; Account.session = 5436; Account account2 = new Account { Sum = 4000 }; Account.session = "45245"; Console.WriteLine(Account.session); // 5436 Console.WriteLine(Account.session); // 45245

В итоге для Account и для Account будет создана своя переменная session.

Использование нескольких универсальных параметров

Обобщения могут использовать несколько универсальных параметров одновременно, которые могут представлять различные типы:

Class Transaction { public U FromAccount { get; set; } // с какого счета перевод public U ToAccount { get; set; } // на какой счет перевод public V Code { get; set; } // код операции public int Sum { get; set; } // сумма перевода }

Здесь класс Transaction использует два универсальных параметра. Применим данный класс:

Account acc1 = new Account { Id = 1857, Sum = 4500 }; Account acc2 = new Account { Id = 3453, Sum = 5000 }; Transaction, string> transaction1 = new Transaction, string> { FromAccount = acc1, ToAccount = acc2, Code = "45478758", Sum = 900 };

Здесь объект Transaction типизируется типами Account и string. То есть в качестве универсального параметра U используется класс Account, а для параметра V - тип string. При этом, как можно заметить, класс, которым типизируется Transaction, сам является обобщенным.

Обобщенные методы

Кроме обобщенных классов можно также создавать обобщенные методы, которые точно также будут использовать универсальные параметры. Например:

Class Program { private static void Main(string args) { int x = 7; int y = 25; Swap(ref x, ref y); Console.WriteLine($"x={x} y={y}"); // x=25 y=7 string s1 = "hello"; string s2 = "bye"; Swap(ref s1, ref s2); Console.WriteLine($"s1={s1} s2={s2}"); // s1=bye s2=hello Console.Read(); } public static void Swap (ref T x, ref T y) { T temp = x; x = y; y = temp; } }

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

В методе Main вызываем метод Swap, типизируем его определенным типом и передаем ему некоторые значения.



В продолжение темы:
Windows

Часть вторая : "Важнейшие характеристики каждого семейства процессоров Intel Core i3/i5/i7. Какие из этих чипов представляют особый интерес" Введение Сначала мы приведём...

Новые статьи
/
Популярные