Ім'я файлу: ООП Лаб. Робота №5.docx
Розширення: docx
Розмір: 122кб.
Дата: 21.11.2022
скачати

Міністерство освіти і науки України

Національний технічний університет України

“ Київський політехнічний інститут імені Ігоря Сікорського ”

Кафедра автоматизації

енергосистем

Заняття № 5

Вивчення успадкування та поліморфізму



Виконав:

студент групи:

ЕК-91




Лютер А.О.

Перевірив:

Старший викладач

Труніна Г.О.







Київ – 2021

Мета роботи: знайомство з двома основами об’єктно-орієнтованого

програмування – успадкуванням та поліморфізмом.
Теоретичні відомості

Успадкування – це властивість класу породжувати нащадків. Тобто: клас-

нащадок (дочірній клас) успадковує від базового(батьківського) частину полів і

методів, та може доповнюватись новими полями та методами.

Поліморфізм – це властивість споріднених об’єктів вирішувати подібні

проблеми різними способами.

Щоб один клас успадковував інший використовують наступний

синтаксис:

class <ім’я_класу_нащадку> : <ім’я_базового_класу>

Ключове слово base означає, що при створенні об’єкту спочатку

викликається базовий конструктор батьківського класу, після чого в середині

конструктора Point можна виконати унікальні для цього класу дії.

Крім того, з усіма об’єктами нащадками базового класу можна спільно

працювати, як з об’єктами базового класу.

Слід зазначити, що взагалі всі класи .Net є нащадками базового класу

System.Object. Це наслідування відбувається неявно, без буд-яких вказівок.

Від System.Object всі класи успадковують ряд корисних методів, серед яких:

public Type GetType() – повертає об’єкт класу Type, що містить

детальну інформацію поточний об’єкт (до якого класу відноситься,

чи є об’єкт масивом, чи являється екземпляром класу або

перерахуванням і т. д.

public virtual string ToString() – повертає представлення

об’єкту у вигляді рядка (для більності об’єктів – це ім’я класу, а для

чисел значення у вигляді рядку), може перевантажуватись.

public virtual bool Equals(Object obj) для порівняння

поточного об’єкту з іншими), може перевантажуватись, повертає

true, якщо об’єкти рівні.

public static bool Equals(Object objA, Object objB) –

для порівняння двох різних об’єктів.

Модифікатори abstract, new, sealed

Модифікатор abstract вказує на те, що елемент має відсутню або

неповну реалізацію. Його можна використовувати з класами, методами, та

властивостями.

При оголошенні класу модифікатор abstract дозволяє вказати, що клас

може бути тільки базовим класом для інших класів. Створювати об’єкти

абстрактного класу не можна.

Члени класу (методи та властивості), помічені як абстрактні або включені

в абстрактний клас, повинні бути реалізовані класами-нащадками абстрактного

класу. Абстрактні методи неявно являються віртуальними методами.

Оголошення абстрактних методів допустимо тільки в абстрактних класах. Так як при оголошенні абстрактних методів реалізація відсутня, то не потрібні і фігурні дужки для тіла методу, натомість в кінці оголошення ставиться крапка с комою (;).

Порядок виконання роботи

1. Ознайомитись із теоретичним матеріалом.

2. Створити проект Windows Forms.

3. В проекті створити клас Object2D

4. В цьому класі створити поля:

protected int x, y;

protected Color color;

5. Створити для Object2D властивості для полів, конструктор для заповнення значень полів та методи:

public virtual void Draw(Graphics gr){}

public void Move(int dx, int dy) {

x += dx; y += dy;

}

6. Використовуючи Object2D як базовий клас, створити ієрархію класів

еліпс, круг, прямокутник, квадрат, кожен в окремому файлі. В кожному з

класів створити необхідний конструктор та перевантажити метод

Draw(Graphics gr) для малювання зафарбованого об’єкту методами

Graphics.

7. Продемонструвати роботу класів з відображенням їх на формі, для цього:

а) Додати в класі форми поле типу список:

private List; objects2D = new List();

б) До класу форми додати метод для створення 2-3 об’єктів для кожного

класу.

Виклик методу додати в конструктор форми поруч з

InitializeComponent();

в) Прописати відображення об’єктів в події Paint, наприклад:

private void Form1_Paint(object sender, PaintEventArgs e)

{

Graphics gr = e.Graphics;

foreach (Object2D obj in objects2D) {

obj.Draw(gr);

}

}

8. Додати PropertyGrid на форму.

9. Для всіх класів нащадків Object2D описати метод, який визначатиме чи

потрапила крапка на об’єкт чи ні.

10. За допомогою цього метода, виводити властивості поточного об’єкту при

натисканні на ньому лівої клавіши миши.

11. Налагодити програму на комп’ютері.

12. Забезпечити вивід результатів роботи програми на екран комп’ютера.

13. Підготувати звіт по роботі.

Програмний код

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;
namespace Лютер_ЛР__4

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

this.MouseClick += Form1MouseClick;

}

private void Form1_Load(object sender, EventArgs e)

{
}

//Шаблони стандартних фігур

Quad quad_standart = new Quad(Color.Black, 0, 0, 0);

Circle circle_standart = new Circle(Color.Black, 0, 0, 0);

Rectangle rectangle_standart = new Rectangle(Color.Black, 0, 0, 0, 0);

Ellipse ellipse_standart = new Ellipse(Color.Black, 0, 0, 0, 0);

//Очистка форми

private void button2_Click(object sender, EventArgs e)

{

Graphics g = this.CreateGraphics();

g.Clear(Color.White);

this.propertyGrid1.SelectedObject = null;

}

//Відображення фігур за номерами

private void button7_Click(object sender, EventArgs e)

{

int sx = 25;

int sy = 25;

Graphics g = this.CreateGraphics();

int index = Convert.ToInt32(textBox1.Text);

switch (index)

{

case 1:

quad_standart = new Quad(Color.Goldenrod, sx, sy, 74);

quad_standart.Draw(g);

break;

case 2:

circle_standart = new Circle(Color.CornflowerBlue, sx, sy, 68);

circle_standart.Draw(g);

break;

case 3:

rectangle_standart = new Rectangle(Color.DarkSalmon, sx, sy, 52, 96);

rectangle_standart.Draw(g);

break;

case 4:

ellipse_standart = new Ellipse(Color.Navy, sx, sy, 107, 51);

ellipse_standart.Draw(g);

break;

}

}

//Метод для руху фігур по формі

private void Move_Figure(int dx, int dy)

{

int index;

if(textBox1.Text == null)

{

index = 0;

}

else

{

index = Convert.ToInt32(textBox1.Text);

Graphics g = this.CreateGraphics();

switch (index)

{

case 1: quad_standart.Move(dx, dy, g); break;

case 2: circle_standart.Move(dx, dy, g); break;

case 3: rectangle_standart.Move(dx, dy, g); break;

case 4: ellipse_standart.Move(dx, dy, g); break;

}

}

}

//Рух фігури по формі

private void button3_Click(object sender, EventArgs e)

{

Move_Figure(0, -5);

}

private void button4_Click(object sender, EventArgs e)

{

Move_Figure(0, 5);

}

private void button5_Click(object sender, EventArgs e)

{

Move_Figure(-5, 0);

}

private void button6_Click(object sender, EventArgs e)

{

Move_Figure(5, 0);

}

//Прибирання фігури з форми

private void button8_Click(object sender, EventArgs e)

{

this.propertyGrid1.SelectedObject = null;

int index;

if (textBox1.Text == null)

{

index = 0;

}

else

{

index = Convert.ToInt32(textBox1.Text);

Graphics g = this.CreateGraphics();

switch (index)

{

case 1: quad_standart.Remove(g); break;

case 2: circle_standart.Remove(g); break;

case 3: rectangle_standart.Remove(g); break;

case 4: ellipse_standart.Remove(g); break;

}

}

}

//Відображення властивостей обраного об'єкту

void Form1MouseClick(object sender, MouseEventArgs e)

{

Graphics g = this.CreateGraphics();

int Mouse_X = Cursor.Position.X - this.Left;

int Mouse_Y = Cursor.Position.Y - this.Top - 20;

if (Mouse_X > quad_standart.X && Mouse_X < (quad_standart.X + quad_standart.Side) && Mouse_Y > quad_standart.Y && Mouse_Y < (quad_standart.Y + quad_standart.Side))

{

this.propertyGrid1.SelectedObject = quad_standart;

this.textBox1.Text = "1";

}

else if (Mouse_X > circle_standart.X && Mouse_X < (circle_standart.X + circle_standart.Rad) && Mouse_Y > circle_standart.Y && Mouse_Y < (circle_standart.Y + circle_standart.Rad))

{

this.propertyGrid1.SelectedObject = circle_standart;

this.textBox1.Text = "2";

}

else if (Mouse_X > rectangle_standart.X && Mouse_X < (rectangle_standart.X + rectangle_standart.Side) && Mouse_Y > rectangle_standart.Y && Mouse_Y < (rectangle_standart.Y + rectangle_standart.Height))

{

this.propertyGrid1.SelectedObject = rectangle_standart;

this.textBox1.Text = "3";

}

else if (Mouse_X > ellipse_standart.X && Mouse_X < (ellipse_standart.X + ellipse_standart.Rad) && Mouse_Y > ellipse_standart.Y && Mouse_Y < (ellipse_standart.Y + ellipse_standart.Rad2))

{

this.propertyGrid1.SelectedObject = ellipse_standart;

this.textBox1.Text = "4";

}

}

//Збереження змін власивостей

private void button1_Click(object sender, EventArgs e)

{

Graphics g = this.CreateGraphics();

g.Clear(Color.White);

Move_Figure(0, 0);

}

}

}

Батьківський клас

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Drawing;
namespace Лютер_ЛР__4

{

abstract class Object2D

{

protected int x, y;

protected Color color = Color.Red;

public Pen pn = new Pen(Color.GreenYellow);

public Brush br = new SolidBrush(Color.White);

public int X

{

get { return x; }

set { x = value; }

}

public int Y

{

get { return y; }

set { y = value; }

}

public Color Color

{

get { return color; }

set { color = value; }

}

public virtual void Draw(Graphics gr) { }

public void Move(int dx, int dy)

{

x += dx;

y += dy;

}

public virtual void Remove(Graphics gr) { }

}

}

Клас Коло

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Drawing;
namespace Лютер_ЛР__4

{

class Circle:Object2D

{

public int rad1;

public int Rad

{

get { return rad1; }

set { rad1 = value; }

}

public Circle(Color color, int x, int y, int rad1)

{

this.color = color;

this.x = x;

this.y = y;

this.rad1 = rad1;

}

public override void Draw(Graphics gr)

{

gr.FillEllipse(new SolidBrush(color), x, y, rad1, rad1);

}

public virtual void Move(int dx, int dy, Graphics g)

{

g.FillEllipse(br, x, y, rad1, rad1);

x += dx;

y += dy;

Draw(g);

}

public override void Remove(Graphics gr)

{

gr.FillEllipse(new SolidBrush(Color.White), x, y, rad1, rad1);

}

}

}

Клас Еліпс

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Drawing;
namespace Лютер_ЛР__4

{

class Ellipse:Circle

{

private int rad2;

[System.ComponentModel.Browsable(false)]

public int Rad2

{

get { return rad2; }

set { rad2 = value; }

}

public Ellipse(Color color, int x, int y, int rad1, int rad2):base(color, x, y, rad1)

{

this.rad2 = rad2;

}

public override void Draw(Graphics gr)

{

gr.FillEllipse(new SolidBrush(color), x, y, rad1, rad2);

}

public override void Move(int dx, int dy, Graphics g)

{

g.FillEllipse(br, x, y, rad1, rad2);

x += dx;

y += dy;

Draw(g);

}

public override void Remove(Graphics gr)

{

gr.FillEllipse(new SolidBrush(Color.White), x, y, rad1, rad2);

}

}

}

Клас Квадрат

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Drawing;
namespace Лютер_ЛР__4

{

class Quad:Object2D

{

public int side;

public int Side

{

get { return side; }

set { side = value; }

}

public Quad(Color color, int x, int y, int side)

{

this.color = color;

this.x = x;

this.y = y;

this.side = side;

}

public override void Draw(Graphics gr)

{

gr.FillRectangle(new SolidBrush(color), x, y, side, side);

}

public virtual void Move(int dx, int dy, Graphics g)

{

g.FillRectangle(br, x, y, side, side);

x += dx;

y += dy;

Draw(g);

}

public override void Remove(Graphics gr)

{

gr.FillRectangle(new SolidBrush(Color.White), x, y, side, side);

}

}

}

Клас Прямокутник

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Drawing;
namespace Лютер_ЛР__4

{

class Rectangle: Quad

{

private int height;

public int Height

{

get { return height; }

set { height = value; }

}

public Rectangle(Color color, int x, int y, int side, int height):base(color, x, y, side)

{

this.height = height;

}

public override void Draw(Graphics gr)

{

gr.FillRectangle(new SolidBrush(color), x, y, side, height);

}

public override void Move(int dx, int dy, Graphics g)

{

g.FillRectangle(br, x, y, side, height);

x += dx;

y += dy;

Draw(g);

}

public override void Remove(Graphics gr)

{

gr.FillRectangle(new SolidBrush(Color.White), x, y, side, height);

}

}

}
Програма реалізує відображення, рух та прибирання фігури з форми за обраним індексом, відображення та зміну обраних властивостей через PropertyGrid.

В якості прихованої для зміни властивості був обраний другий радіус еліпса.

Результат роботи програми

Використані кнопки виділені на формі










скачати

© Усі права захищені
написати до нас