Объектно-ориентированное программирование» для студентов специальности 5В070300 «Информационные системы» идля оп 6В06120 «Информационные системы» Шымкент 2022



бет39/43
Дата28.03.2023
өлшемі1,44 Mb.
#76860
1   ...   35   36   37   38   39   40   41   42   43
Байланысты:
ООП ЛЕКЦИОННЫЙ КОМПЛЕКС 2022рус (1)

Контрольные вопросы:
1. Опишите назначение и свойства абстрактного класса, приведите примеры программного кода.
2. Опишите механизм перегрузки операций, его назначение и роль в работе с объектами.
3. Не перегружать перевод без списка операторов.
4. Опишите способы перегрузки операций и количество приведенных аргументов. Приведите примеры программного кода.
5. Приведите общий синтаксис дочернего класса и примеры программного кода.


Лекция 28. формирование простого приложения графического редактора в среде Visual C# (на примере).


Цель лекции: формирование у студентов умений демонстрировать свои представления о формирование простого приложения графического редактора в среде Visual C#
В результате освоения данной лекции студенты приобретают следующие способности: наследования является повторное использование созданных классов.
Принцип наследования является фундаментальным в концепции объектно-ориентированного программирования. Целью наследования является повторное использование созданных классов. Некоторые авторы приводят пример иерархической связи от общего к частному при объяснении идеи наследования классов: Животные-кошки-тигры. Другие авторы объясняют идею наследования классов на примере иерархической связи меньшего от объекта к большему: Точка-отрезок-прямоугольник. Эти два подхода авторов используются в интерпретации материала.
Подход» от меньшего объекта к большему объекту «позволяет объяснить идею наследования – точка, затем отрезок и т.д. данную технологию можно использовать при подготовке наследуемой последовательности классов» с нуля". При втором подходе "от общего к частному" использование созданных классов, например, VCL в DELPHI, MFC в среде VISUAL С++ и других стандартных библиотек, пространства имен в языке C#. Класс, данные или методы которого наследуются, называется базовым классом. Класс, который наследует данные или методы от базового класса, называется производным классом. Наследование создает возможность для производного класса использовать свои свойства, данные, методы, а также свойства, данные, методы базового класса. Чтобы объяснить идею наследования, давайте рассмотрим следующий пример. Пусть Вам нужно написать определенный класс, в который будут добавлены дополнительные свойства и данные по сравнению с предыдущим классом в программе.
По первому способу необходимо скопировать класс в одной программе в новую и записать в нее необходимые изменения. По второму методу необходимо создать второй класс, который наследует предыдущий класс (вытекающий из предыдущего класса). Из двух рассмотренных методов наиболее предпочтительным является второй метод по написанию программы и с точки зрения ОББ. Наследование классов значительно сокращает код программы, сокращает время ее создания и повышает надежность. Наследуемые производные классы позволяют использовать поля, свойства, методы базового класса и создавать иерархическую структуру, которая может дополнять или изменять их. Таким образом, наследование позволяет использовать код несколько раз. [После того, как вы записали код базового класса и отладили его, вы можете использовать класс для различных ситуаций, не изменяя его код путем наследования.]
В классах, расположенных близко к началу иерархической структуры, объединены общие свойства классов в нижней части структуры. По мере продвижения вниз по иерархической структуре очевидные особенности классов увеличиваются. В языке C# базовым классом иерархической последовательности классов является System.Object. Таким образом, наследование используется для: - предотвращение дублирования фрагментов кода в программе; - упрощение модификации программы; - упрощение создания новой программы с помощью созданной программы. Кроме того, код наследования является только одним из способов использования объектов, которые недоступны, но требуют внесения изменений. В формате записи по наследованию классов класс объявляется обычным образом и через двоеточие записывается название базового класса:
[атрибуты] [спецификации ] Class class_категория [: базовый класс ] { тело класса}
Если имя базового класса не указано, то базовым классом является System.Вычисляется класс Object. Если у нас есть базовый класс, мы должны указать его через двоеточие, например: public class otr : tka { тело класса } В этом примере класс отрезка наследует класс точки. Очевидно, что если данные класса tka закрыты для доступа через спецификатор privat, они также будут закрыты для производного класса. В некоторых базовых классах данные располагаются после спецификации доступа protected. Например,
protected int x;
protected int y;
Необходимость в спецификаторе protected доступа заключается в том, что производный класс может использовать открытые элементы базового класса (спецификатор public). С другой стороны, производный класс не может напрямую использовать закрытые элементы базового класса (private), для этого производный класс должен использовать методы базового класса. Поэтому появился спецификатор доступа protected, который определяет элементы защищенного класса. Защищенные элементы располагаются в центре закрытых и открытых элементов. Если элемент защищен, то объекты производного класса могут использовать его как открытый элемент. Для остальной части программы защищенные элементы будут закрыты. А если в программе нужно обратиться к закрытым элементам, то это можно выполнить только с помощью соответствующих методов класса. Основной проблемой при наследовании класса является последовательность создания объектов при вызове конструкторов класса производной.
Поскольку методы класса производной могут наследоваться данными и методами базового класса, при подготовке объекта класса производной в базовом классе должны содержаться все данные и методы. Поэтому работа конструктора производного класса начинается с вызова конструктора базового класса, после завершения работы которого создается объект производного класса. Конструктор производного класса должен инициализировать элементы данных базового класса, которые наследуются. При вызове деструктора производного класса первым должен быть удален объект производного класса, а затем – объект базового класса. Рассматривая проблему наследования, следует учитывать следующее: конструктор и деструктор базового класса не наследуется (не наследуется) производным классом. Отчет 23.2. необходимо построить последовательность наследуемых классов-точка-отрезок. Следует рассмотреть возможность указания порядка построения объектов класса.
Код программы:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public int ax, ay, bx, by;
public class tka
{
Random rnd = new Random();
protected int x, y;
public string ss;
public tka()
{
x = rnd.Next(100);
y = rnd.Next(100);
}
public void gettka(out int ax, out int ay)
{
ax = x; ay = y;
}
public string printtka()
{
return "[" + x.ToString() + "," + y.ToString() + "]";
}
}
public class otr : tka
{
public tka b;
public string s;
public otr()
{
MessageBox.Show("1-нүкте - кесіндініңбазасы [" + x.ToString() + "," + y.ToString() + "]");
s = "";
}
public void getotr(out int ax, out int ay)
{
int xx, xy;
b.gettka(out xx, out xy);
MessageBox.Show("2-нүкте - кесіндініңөрісі [" + xx.ToString() + "," + xy.ToString() + "]");
ax = xx; ay = xy;
}
public double dlina()
{
double dl;
int k1, k2, k3, k4;
k1 = x; k2 = y;
b.gettka(out k3, out k4);
dl = Math.Sqrt((k1 - k3) * (k1 - k3) + (k2 - k4) * (k2 - k4));
return dl;
}
public void printotr()
{
s = "Кесіндідегінүктекоординаты = " + b.printtka();
s = s + "Кесіндініңбазасындағынүктекоординаты = [" + x.ToString() + "," + y.ToString() + "]";
s = s + " Кесіндініңұзындығы = " + dlina().ToString("###.###");
}
}
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string str;
otr c = new otr();
c.gettka(out bx, out by);
tka bb = new tka();
c.b = bb;
c.getotr(out ax, out ay);
c.printotr();
str = c.s;
textBox1.Text = str;
Invalidate();
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
Pen myPen = new Pen(Color.Red, 2);
Graphics g = e.Graphics;
g.DrawLine(myPen, ax, ay, bx, by);
}
}
}
Работа программы представлена на рисунках 23.2 и 23.3.



Рисунок 23.2-диалоговые точки координат концов отрезка


При создании объекта отрезка создается объект базовый класс – точка (проверка через диалоговое окно 1). Затем создаем объект точки и присваиваем его полю объекта отрезка (проверка через диалоговое окно 2). Вычислим длину отрезка. Все результаты выводим в многострочный текстовый редактор. Построим отрезок в систему координат X, Y (начало в систему координат – левый верхний угол формы). Формируем обработчик событий Form1_Paint: в окне Properties для формы выбираем событие Paint. Подготовим объекты для геометрических фигур и линий и построим линию по координатам отрезка.



Рисунок 23.3 - рабочее окно программы


Запуск обработчика событий (перерисовка окна формы) выполняется методом Invalidate (). Этот метод требует создания сообщения WM_PAINT из Windows. Сообщение поступает в нашу программу, заставляет все окна формы перерисовывать, в результате чего рисуется изображение отрезка.


Достарыңызбен бөлісу:
1   ...   35   36   37   38   39   40   41   42   43




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет