Основные понятия объектно-ориентированного программирования

Задание точек перехода на новую страницу печати

Задание параметров страниц для вывода на печать

При выводе Web-страниц на печать можно с помощью правила @page задать ширину полей на странице (это правило действует только в Web-браузере Opera). В правиле @page можно задавать только свойства семейства margin (см. 4.3.16.1 и 4.3.16.2). Правило действует для всех Web-страниц, однако его действие можно уточнить с помощью псевдоклассов :left и :right.

Псевдоклассы :left и :right задают ширину полей на странице для «левых» и «правых» страниц (например, для нечетных и четных страниц). Эти псевдоклассы используются при двухсторонней печати содержимого Web-страницы.

Если заданы несколько правил @page, то первым должно идти правило без псевдокласса, затем правила для псевдоклассов left и :right.

 

Пример 4.3.106. Использование правила @page:

Для печати «зеркальных» страниц можно задать следующую таблицу стилей:

<style type="text/css" media="print">

@page:right {

margin-top: 20mm; margin-right: 15mm;

margin-bottom: 20mm; margin-left: 30mm

}

 

@page:left {

margin-top: 20mm; margin-right: 30mm;

margin-bottom: 20mm; margin-left: 15mm

}

</style>

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

 

 

 

В остальных Web-браузерах можно задать ширину полей в настройках параметров печати или предварительного просмотра. Однако эти настройки действуют для всех печатаемых страниц. При необходимости иметь разную ширину полей у разных страниц придется несколько раз менять ширину полей и печатать при каждом изменении только те страницы, которые имеют требуемые значения ширины полей. Это же касается вывода отдельных страниц с книжной (portrait) или альбомной (landscape) ориентацией.

Непосредственно задать или, наоборот, отменить переход при печати на новую страницу в любом элементе Web-страницы можно с помощью свойств page-break-before, page-break-after и page-break-inside.

Свойства page-break-before и page-break-after задают режим перехода на новую страницу соответственно до элемента или после элемента, в котором задано одно из этих свойств.

Для этих свойств можно задать одно из следующих значений:

· auto – не выполняет, но и не запрещает переход на новую страницу печати до или после элемента HTML;

· always – всегда выполняет переход на новую страницу печати до или после элемента HTML;

· avoid – запрещает переход на новую страницу печати до или после элемента HTML.

В Web-браузерах Internet Explorer и Opera поддерживается также свойство page-break-inside, которое задает режим перехода на новую страницу для содержимого элемента, в котором задано это свойство. Для свойства определены значения auto и avoid, первое из которых не выполняет, но и не запрещает переход на новую страницу при выводе содержимого элемента HTML, а второе запрещает переход на новую страницу при выводе содержимого элемента HTML.

Значением по умолчанию всех трех свойств является значение auto.

Задавая свойства page-break-before и page-break-after в правилах таблиц стилей, либо непосредственно в атрибуте style элементов Web-страницы можно управлять выводом на печать содержимого Web-страницы.

 

Пример 4.3.107. Использование свойств page-break-before, page-break-after и page-break-inside:

1. Правила этой таблицы стилей задают переход на новую страницу перед заголовком четвертого уровня и после горизонтальной черты класса sectionEnd: <style type="text/css" media="print">

h4 {

page-break-before: always

/* Другие свойства для элемента h4 */

}

hr.sectionEnd {

page-break-after: always

/* Другие свойства для элемента hr */

}

</style>

В окне Предварительный просмотр (в Internet Explorer) и при печати страницы текста будут выведены следующим образом:

 

2. При выводе на печать текста абзац, начинающийся со слов "Эти имена устройств можно задавать…" будет разорван (его начало находиться на первой странице, а окончание – на второй):

 

Если задать для этого абзаца класс unbreak и в таблице стилей задать для этого класса следующее правило:

p.unbreak {

page-break-inside: avoid

}

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

 

 

 

 

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

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

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

При использовании процедурной парадигмы программа разбивается на отдельные модули, называемые процедурами, каждая из которых выполняет определенную последовательность действий в соответствии с разработанным для нее алгоритмом. При вызове процедуры ей могут быть переданы данные (параметры) и, в свою очередь, после выполнения процедура может передать вызвавшей ее процедуре результаты своей работы. В языках программирования для процедур используются также термины функция, подпрограмма или метод. Примерами языков программирования, ориентированными на процедурное программирование, являются языки C, Basic и Pascal. Эти языки называются также алгоритмическими языками, поскольку их средства приспособлены для реализации алгоритмов решения тех или иных задач.

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

Чтобы решить эту проблему была разработана объектно-ориентированная парадигма программирования.

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

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

Основными языками программирования, ориентированными на использование объектно-ориентированной парадигмы являются близкие между собой языки Java и C# (си шарп). Кроме того, для некоторых языков программирования были разработаны объектно-ориентированные расширения. Так объектно-ориентированное расширение языка C называется языком C++, а объектно-ориентированное расширения языка Pascal – языком Object Pascal.

В объектно-ориентированных языках, как уже говорилось, программа представляет собой набор объектов. Характеристики объекта можно разделить на две группы: характеристики состояния объекта и характеристики его поведения.

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

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

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

· model – модель автомобиля;

· color – цвет автомобиля;

· driver – фамилия, имя и отчество водителя.

В качестве метода для myCar можно задать метод distance(time), определяющий пройденное расстояние в зависимости от времени.

Другой объект того же типа, например, yourCar, имеет тот же набор переменных: model, color и driver, а также метод distance(time), однако значения одной или нескольких переменных могут быть разными. Например, для объекта myCar значения модели, цвета и данных о водителе автомобиля могут быть соответственно "Запорожец", "серый" и "Иванов Иван Иванович", а для объекта yourCar – соответственно "BMW", "серый" и "Джон Смит".

Объекты могут взаимодействовать друг с другом, посылая сообщения с просьбой выполнить некоторый метод или выполняя метод в ответ на запрос системы. Взаимодействуя, объекты образуют единое целое – программу.

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

Объекты в программе могут появляться (создаваться) и удаляться (уничтожаться). При создании объекта в объектно-ориентированных языках используются два подхода.

Первый подход основан на понятии класса. Для каждого типа объекта описывается свой класс со своим набором свойств и методов. Так, для объектов myCar и yourCar можно задать класс с именем Car. Классы могут образовывать иерархию. Так, класс Car может быть образован от класса MotorCar, куда входят не только легковые автомобили, но и грузовые автомобили, автобусы и другие виды моторного транспорта. В свою очередь, подклассом класса Car могут быть легковые автомобили на альтернативных источниках питания, например, на аккумуляторных батареях. Автомобили подобного типа можно задать с помощью класса ElectroCar. Такая возможность называется наследованием классов, поскольку класс-наследник сохраняет (наследует) все свойства и методы своего класса-предка. При необходимости в классе-наследнике могут быть добавлены свои свойства и методы, специфичные для данного класса. Кроме того, реализация методов, определенных в классе-родителе могут переопределяться в классах-наследниках (при этом метод имеет то же имя, что и в классе-родителе). Такая возможность называется переопределением методов или полиморфизмом (дословно многоформие) и дает возможность одинаковым образом работать с объектами разных классов, поскольку при вызове методов, общих для этих классов, будет автоматически вызван либо метод класса-родителя (если он не переопределен в данном классе), либо переопределенный метод данного класса.

При таком подходе для класса Car определены все свойства и методы, заданные для класса MotorCar плюс свои собственные свойства и методы (в том числе и переопределенные), а для класса ElectroCar – все свойства и методы, заданные для класса Car плюс свои собственные свойства и методы (в том числе и переопределенные).

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

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