Интернет-журнал "Домашняя лаборатория", 2007 №9
Шрифт:
{
// маленький круг радиуса 4
}
}
}
Класс Rect
Этот класс является еще одним прямым потомком класса Figure:
using System;
using System.Drawing;
namespace Shapes
{
/// <summary>
/// Класс Rect — потомок класса Figure.
/// </summary>
public class Rect: Figure
{
int sideA, sideB;
Rectangle rect;
public Rect(int sideA,int sideB, int x, int y): base(x,y)
{
this.sideA = sideA; this.sideB = sideB;
rect =Init;
}
public override void Show(Graphics g, Pen pen, Brush brush)
{
rect = Init ;
g. DrawRectangle(pen,rect);
g. FillRectangle(brush,rect);
}
public override Rectangle Region_Capture
{
rect = Init ;
return rect;
}
Rectangle Init
{
int a =Convert.ToInt32(sideA*scale);
int b =Convert.ToInt32(sideB*scale);
int leftupX = center.X — a/2;
int leftupY = center.Y — b/2;
return (new Rectangle(leftupX,leftupY,a,b));
}
}
}
Класс Square
Квадрат —
using System;
namespace Shapes
{
/// <summary>
/// Класс Square — потомок класса Rect.
/// </summary>
public class Square: Rect
{
public Square(int side, int x, int y): base(side,side,x,у)
{
//квадрат — это прямоугольник с равными сторонами
}
}
}
Класс Person
Этот класс является прямым потомком класса Figure. Вместе с тем, класс является клиентом трех других классов семейства — Circle, Rect и LittleCircle, поскольку элементы фигуры, составляющие человечка, являются объектами этих классов%
namespace Shapes
{
/// <summary>
/// Класс Person — потомок класса Figure,
/// клиент классов Circle, Rect, LittleCircle.
/// </summary>
public class Person: Figure
{
int head_h;
Circle head;
Rect body;
LittleCircle nose;
public Person (int head_h, int x, int y): base(x,y)
{
// head_h — радиус головы, x,y — ее центр.
// остальные размеры исчисляются относительно
// размера головы.
this.head_h = head_h;
head = new Circle(head_h,x,у);
int body_x = x;
int body_y = у + 3*head_h;
int body_w =2*head_h;
int body_h = 4*head_h;
body = new Rect(body_w, body_h, body_x,body_y);
nose = new LittleCircle (x+head_h +2, y);
}
public override void Show(System.Drawing.Graphics g,
System.Drawing.Pen pen, System.Drawing.Brush brush)
{
int h = Convert.ToInt32(head_h*scale);
//head
int top_x = center.X — h;
int top_y = center.Y — h;
g. DrawEllipse(pen, top_x,top_y, 2*h,2*h);
g. FillEllipse(brush, top_x,top_y, 2*h,2*h);
//body
top_y += 2*h;
g. DrawRectangle(pen, top_x,top_y, 2*h,4*h);
g. FillRectangle(brush, top_x,top_y, 2*h,4*h);
//nose
top_y — =h; top_x += 2*h;
g. DrawEllipse(pen, top_x,top_y, 8,8);
g. FillEllipse(brush, top_x,top_y, 8,8);
}
public override System.Drawing.Rectangle
Region_Capture
{
int h = Convert.ToInt32(head_h*scale);
int top_x = center.X — h;
int top_y = center.Y — h;
return new
System.Drawing.Rectangle(top_x,top_y,2*h,2*h);
}
}
}
Список с курсором. Динамические структуры данных
Добавим в проект классы, задающие динамические структуры данных. Конечно, можно было бы воспользоваться стандартными… Но для обучения крайне полезно уметь создавать собственные задающие такие структуры данных. Список с курсором — один из важнейших образцов подобных классов:
using System;
namespace Shapes {
/// <summary>
/// Класс TwoWayList(G) описывает двусвязный список с
/// курсором. Элементами списка являются объекты
/// TwoLinkable, хранящие, помимо указателей на двух
/// преемников, объекты типа G.Курсор будет определять
/// текущий (активный) элемент списка. Класс будет
/// определять симметричные операции по отношению к курсору.
/// Конструкторы:
/// Конструктор без параметров будет создавать пустой список
/// Запросы:
/// empty: require: true; возвращает true для пустого списка
/// item: require: not empty; возвращает активный элемент типа G;
/// require: true; возвращает число элементов списка;
/// count: count in[0,n] (count == 0) eqviv empty ;
/// index: require: not empty; возвращает индекс активного элемента.
/// search_res: require: true; возвращает true, если последний поиск был успешным.
/// Команды:
/// put_left(elem): require: true;