Не обнаружил проекты, которые используются в примерах в лекции, также не увидел список задач. |
Финальный проект
В этой заключительной лекции новый материал появляться не будет, не будет и традиционных вопросов в конце лекции. Лекция особенная - она посвящена описанию финального проекта, в котором объединены многие, надеюсь, уже хорошо знакомые элементы.
В финальном проекте создается семейство классов, описывающих геометрические фигуры. Проектирование начинается с абстрактного класса поведения, который описывает общие свойства и методы, характерные для всех фигур семейства. Затем, используя наследование, создаются классы конкретных геометрических фигур, начиная с простейших, таких, как круги и прямоугольники, до составных, таких, как класс Person. Мы добавим в наш проект динамические структуры данных, такие, как список с курсором, для хранения в нем фигур семейства. Наконец, мы создадим интерфейс, включающий меню с десятками команд и панель с инструментальными кнопками. Интерфейс позволяет конечному пользователю выполнять различные действия над геометрическими фигурами - создавать, рисовать их на форме, перемещать их с помощью команд и перетаскивать их мышью, менять их размеры и цвет, сохранять в списке и удалять из списка, отображать все фигуры списка или очистить его полностью.
Проект может служить образцом полноценного Windows-приложения, примером проектирования в классах с демонстрацией преимуществ, предоставляемых наследованием. Закончим на этом рекламную часть и приступим к делу. Хочу предупредить, вас ждут программные тексты, почти без всяких комментариев. Все нужные комментарии были даны в предыдущих лекциях. С моей точки зрения, наиболее интересная часть программистских книжек - это та, в которой приводится программный код. И значит, эта глава самая интересная.
Абстрактный класс Figure
Приведем код класса:
using System; using System.Drawing; namespace Shapes { /// <summary> /// Figure - это абстрактный класс; прародитель семейства /// классов геометрических фигур. Все фигуры имеют: /// центр - center, масштаб - scale. статус /// перетаскивания - dragged center - объект встроенного /// класса (структуры) Point. Этот объект задает характерную /// точку фигуры - чаще всего ее центр (тяжести) /// scale задает масштаб фигуры, первоначально единичный. /// drugged = true, когда фигура следует за курсором мыши. /// над фигурами определены операции: параллельный /// перенос - Move(a,b) масштабирование - Scale(s) /// Показ фигуры - Show. Область захвата - Region_Capture /// возвращает прямоугольник, характерный для фигуры, /// перетаскивание фигуры возможно при установке курсора /// мыши в области захвата. /// </summary> abstract public class Figure { /// <summary> /// закрытые для клиентов атрибуты класса - center, scale /// </summary> protected Point center; protected double scale ; protected bool dragged; protected Color color; //Доступ к свойствам public Point center_figure { get {return(center);} set {center = value;} } public double scale_figure { get {return(scale);} set {scale = value;} } public bool dragged_figure { get {return(dragged);} set {dragged = value;} } public Color color_figure { get {return(color);} set {color = value;} } /// <summary> /// базовый конструктор фигур /// </summary> /// <param name="x">координата X характерной точки ///фигуры</param> /// <param name="y">Координата Y характерной точки ///фигуры</param> public Figure(int x, int y) { center = new Point(x,y); scale = 1; dragged = false; color = Color.ForestGreen; } /// <summary> /// отложенный метод /// Параллельный перенос фигуры на (a,b) /// require : true; /// ensure : для любой точки фигуры p(x,y): /// x = old(x) +a; y = old(y) + b; /// </summary> /// <param name="a">a - перемещение по горизонтали ///вправо </param> /// <param name="b">b - перемещение по вертикали ///вниз</param> /// Замечание: Для того, чтобы фигура при рисовании была /// полностью видимой, координаты всех ее точек должны /// быть в пределах области рисования. public void Move (int a,int b) { center.X +=a; center.Y += b; } /// <summary> /// изменяет масштаб фигуры /// </summary> /// <param name="s">масштаб изменяется в s раз</param> public void Scale(double s) { scale*=s; } /// <summary> /// рисование фигуры в окне, передающем объекты g и pen /// </summary> /// <param name="g"> графический объект, методы которого /// рисуют фигуру</param> /// <param name="pen">перо рисования</param> public abstract void Show(Graphics g, Pen pen, Brush brush); public abstract System.Drawing.Rectangle Region_Capture(); }
Абстрактный класс, относящийся к этапу проектирования системы, вместе с тем является важнейшим элементом заключительного семейства классов. В этом проявляется мощь объектно-ориентированного подхода к разработке программных систем. Заметьте, на данном уровне большая часть текста представляет документацию, являющуюся неотъемлемой частью программного проекта. Документация записана в тегах <summary>, что позволяет автоматически ее извлечь и сохранить в виде XML-отчета.
Классы семейства геометрических фигур
Приведем теперь программные коды классов, являющихся потомками класса Figure.