Выбрать главу

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;

   /// ensure: добавить новый элемент (elem) слева от курсора;

   /// put_right(elem): require: true;

   /// ensure: добавить новый элемент (elem) справа от курсора;

   /// remove: require: not empty();

   /// ensure: удалить активный элемент;

   /// особо обрабатывается удаление последнего и единственного элементов

   /// операции с курсором:

   /// start: require: true;

   /// ensure: сделать активным первый элемент;

   /// finish: require: true;

   /// ensure: сделать активным последний элемент;

   /// go_prev: require: not (index = 1);

   /// ensure: сделать активным предыдущий элемент;

   /// go_next: require: not (index = count);

   /// ensure: сделать активным последующий элемент;

   /// go_i(i): require: (i in [1, count]);

   /// ensure: сделать активным элемент с индексом i;

   /// операции поиска: