Лабораторная работа №11. Наследование, виртуальные методы
{
0.75 балла
} [Класс:LinePrinter
] Определите классLinePrinter
— «принтер длинных строк» — с единственным методомvoid Print(string line)
.Метод печати
void Print(string line)
должен печатать строкуline
(не содержит переходов на новую строку, это можно не проверять) следующим образом:line
разбивается на набор строк по N символов в каждой строке; каждая строка длины N выводится на консоль в отдельной строке; последняя строка набора может содержать меньше N символов, если длинаline
не кратна N.
Замечание. Выводить строки посимвольно запрещается, используйте подходящие методы классаstring
!Конструктор класса должен принимать N > 0 — максимальное число символов в печатаемой строке.
Пример:
Исходная строка: 'Meantime we shall express our darker purpose.' Печать принтером для N = 11: Meantime we shall expr ess our dar ker purpose . Печать принтером для N = 5: Meant ime w e sha ll ex press our darke r pur pose.
Демонстрация. Проверьте работу принтера в основной программе. Проверьте принтер с параметром N = 1.
{
1.75 балла
} [Класс:NumberedLinePrinter
] Определите классNumberedLinePrinter
, который действует аналогичноLinePrinter
, но выводит номера печатаемых строк.
Указание. Используйте наследование.Пример:
Исходная строка: "Meantime we shall express our darker purpose." Печать принтером для N = 8: 1. Meantime 2. we shal 3. l expres 4. s our da 5. rker pur 6. pose.
Демонстрация. Проверьте работу принтера в основной программе.
{
2.75 балла
} [Класс:HidingLinePrinter
] Определите класс принтера строкиHidingLinePrinter
, который кроме N принимает ещё один параметр — строку символовhiddenChars
. Этот принтер печатает строку аналогичноNumberedLinePrinter
, но все символы из массиваhiddenChars
заменяет звёздочками.Пример:
Исходная строка: "Meantime we shall express our darker purpose." Печать принтером для N = 8, hiddenChars = "eoapt": 1. M**n*im* 2. w* sh*l 3. l *x*r*s 4. s *ur d* 5. rk*r *ur 6. **s*.
Демонстрация. Проверьте работу принтера в основной программе.
{
3.25 балла
}Cоздать коллекцию List<LinePrinter> объектов-принтеров, которая содержит все три вида принтеров. С помощью каждого принтера из этой коллекции распечатайте одну и ту же строку.
Указание Чтобы заставить нашу программу использовать Print того класса принтера, к которому каждый объект-принтер из коллекции относится на самом деле (на этапе выполнения программы), необходимо «активировать» для метода Print позднее связывание. Для этого в базовом классе Print нужно объявить виртуальным с помощью ключевого слова
virtual
, а при переопределении метода в классе-потомке следует указать ключевое словоoverride
.{
4 балла
} Добавьте в классLinePrinter
два метода:- процедуру
FancyPrint
, который принимает вектор (или любую другую коллекцию) строк (строки не содержат символов перехода на новую строку, это можно не проверять). protected
-функциюPadFancy
, которая принимает строкуline
и натуральное число N > 0, и возвращает строку, которая представляет собойline
, возможно дополненную символами решётки (#) до длины N (если длинаline
< N).
Метод
FancyPrint
должен печатать строки массива, преобразованные с помощьюPadFancy
, где в качестве N берётся длина самой длинной строки массива.Сделайте так, чтобы
FancyPrint
классаHidingLinePrinter
дополнял строки вектора не решётками, а случайной последовательностью цифр.Указание. Переопределять метод
FancyPrint
запрещается.- процедуру
Демонстрация. Вызовите FancyPrint
для каждого принтера из коллекции
Дополнительные задачи
Реализуйте класс принтера, который выводит строки с указанием номеров строк, но предварительно выводит информацию об общем количестве строк для вывода.