Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
[ТП]Lektsii / Лекции по С#.doc
Скачиваний:
147
Добавлен:
31.05.2015
Размер:
2.47 Mб
Скачать

25. Лекция: Финальный проект

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

В финальном проекте создается семейство классов, описывающих геометрические фигуры. Проектирование начинается с абстрактного класса поведения, который описывает общие свойства и методы, характерные для всех фигур семейства. Затем, используя наследование, создаются классы конкретных геометрических фигур, начиная с простейших, таких, как круги и прямоугольники, до составных, таких, как класс 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);}

get {center = value;}

}

public double scale_figure

{

get{return(scale);}

get {scale = value;}

}

public bool dragged_figure

{

get{return(dragged);}

get {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.

Класс Ellipse

Вот программный код этого класса:

using System;

using System.Drawing;

namespace Shapes

{

/// <summary>

/// Класс Ellipse - потомок класса Figure.

/// </summary>

public class Ellipse: Figure

{

int axisA,axisB;

Rectangle rect;

public Ellipse(int A, int B, int x, int y ): base(x,y)

{

axisA = A; axisB = B;

rect =Init();

}

public override void Show(Graphics g, Pen pen, Brush brush)

{

rect = Init();

g.DrawEllipse(pen,rect);

g.FillEllipse(brush, rect);

}

public override Rectangle Region_Capture()

{

rect = Init();

return rect;

}

Rectangle Init()

{

int a =Convert.ToInt32(axisA*scale);

int b =Convert.ToInt32(axisB*scale);

int leftupX = center.X - a;

int leftupY = center.Y - b;

return( new Rectangle(leftupX,leftupY,2*a,2*b));

}

}

}