Интернет-журнал "Домашняя лаборатория", 2007 №9
Шрифт:
{
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 характерной точки
///фигуры</param>
/// <param name="у">Координата Y
///фигуры</param>
public Figure(int x, int y)
{
center = new Point(x,y);
scale = 1;
dragged = false;
color = Color.ForestGreen;
}
/// <summary>
/// отложенный метод
/// Параллельный перенос фигуры на (а, Ь)
/// require: true;
/// ensure: для любой точки фигуры р(х, у):
/// х = old(x) + а; у = old(у) + Ь;
/// </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 и реп
/// </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 у): base(x,у)
{
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));
}
}
}
Класс Circle
Этот класс является потомком класса Ellipse:
using System;
using System.Drawing;
namespace Shapes
{
/// <summary>
/// Класс Circle — потомок класса Ellipse.
/// </summary>
public class Circle: Ellipse
{
public Circle (int radius,int x, int y):base(radius,radius,x,y)
{
// Круг — это эллипс с равными полуосями (радиусом круга)
}
}
}
Здесь опять-таки проявляется мощь наследования. Потомок наследует все свойства и методы родителя. Ему остается только указать собственный конструктор объектов класса, да и в нем главное состоит в вызове конструктора родительского класса с передачей ему нужных аргументов.
Класс LittleCircle
Этот класс, задающие маленькие кружочки фиксированного радиуса, в свою очередь, является наследником класса Circle. Устроен он также чрезвычайно просто:
using System;
namespace Shapes
{
/// <summary>
/// Класс LittleCircle — потомок класса Circle.
/// </summary>
public class LittleCircle: Circle
{
public LittleCircle(int x,int y): base(4,x,y)