- •Введение
- •1 Компоненты Visual C#
- •1.1 Компонент класса GroupBox
- •1.2 Компонент класса RadioButton
- •1.3 Компонент класса CheckBox
- •1.4 Компонент класса ListBox
- •1.5 Компонент класса Form
- •1.6 Компонент класса PictureBox
- •1.7 Компонент класса Timer
- •1.8 Компонент класса MenuStrip
- •1.9 Компоненты классов ToolStrip и ToolStripButton
- •1.10 Компоненты классов StatusStrip и ToolStripStatusLabel
- •1.11 Компоненты классов OpenFileDialog и SaveFileDialog
- •1.12 Компонент класса TreeView
- •2 Примеры выполнения практических заданий
- •2.1 Стандартные алгоритмы
- •2.2 Элементы выбора
- •2.3 Простейшие классы
- •2.4 Графика
- •2.5 Диалоговые окна
- •2.6 Комплексное задание
- •2.7 Наследование
- •2.8 Древовидные структуры
- •Список литературы
2.7 Наследование
Задание: Разработать программу, использующую иерархию классов. Базовый класс – функция; базовая функция – расчет; базовый параметр – х. Параметры классов-наследников приведены в таблице 8:
Таблица 8 – Параметры классов-наследников
Название |
Описание |
Дополнительные |
Расчетная |
|
базового |
параметры |
функция |
|
параметра |
|
|
Log10 |
аргумент |
|
S = ln(х)/ln(10) |
LogA |
функции |
a – основание логарифма |
S = ln(х)/ln(a) |
При вводе данных классов-наследников использовать диалоговые формы. Предусмотреть контроль правильности ввода данных. Обеспечить запрет недопустимых действий. Введенные данные хранить в компоненте класса ListBox. При выборе строки в списке данных в компоненте класса TextBox отображать результат вычисления базовой функции.
Для решения поставленной задачи на основной форме (Main_F) потребуются компоненты:
Spisok_L класса Label для подписи компонента Spisok_LB;
Spisok_LB класса ListBox для хранения и отображения введенных
элементов;
Select_GB класса GroupBox для компоновки компонентов выбора вида добавляемого элемента;
Log10_RB класса RadioButton для выбора добавления десятичного логарифма;
LogA_RB класса RadioButton для выбора добавления логарифма по основанию "a";
Add_B класса Button для активизации добавления элемента;
Change_B класса Button для активизации редактирования выбранного
элемента;
Del_B класса Button для активизации удаления выбранного элемента;
Result_L класса Label для подписи компонента Result_TB;
Result_TB класса TextBox для вывода результата расчета базовой
функции у выбранного элемента.
Установим следующие значения свойств компонентов (таблица 9):
38
Таблица 9 – Значения свойств компонентов основной формы для примера программы, реализующей работу с иерархией классов
Компонент.Свойство |
Значение |
Spisok_L.Text |
Спи&сок элементов |
Select_GB.Text |
Вид добавляемого элемента |
Log10_RB.Text |
&десятичный логарифм |
LogA_RB.Text |
логарифм по &основанию А |
Add_B.Text |
Доб&авить |
Change_B.Text |
И&зменить |
Del_B.Text |
Уда&лить |
Result_TB.ReadOnly |
true |
|
|
Result_L.Text |
Р&езультат |
На форме диалогового окна работы с десятичным логарифмом (Log10_F) потребуются компоненты:
X_L класса Label для подписи компонента X_TB;
X_TB класса TextBox для ввода аргумента;
Ok_B класса Button для подтверждения добавления или редактирова-
ния;
Cancel_B класса Button для отмены добавления или редактирования. Установим следующие значения свойств компонентов (таблица 10):
Таблица 10 – Значения свойств компонентов диалогового окна для работы с десятичным логарифмом
Компонент.Свойство |
Значение |
Log10_F.FormBorderStyle |
FixedDialog |
|
|
Log10_F.AcceptButton |
Ok_B |
|
|
Log10_F.CancelButton |
Cancel_B |
|
|
Log10_F.MinimizeBox |
false |
|
|
Log10_F.MaximizeBox |
false |
|
|
Log10_F.ShowInTaskbar |
false |
|
|
X_L.Text |
Ар&гумент |
Ok_B.Text |
Ok |
Ok_B.DialogResult |
OK |
|
|
Cancel_B.Text |
Отм&ена |
Cancel_B.DialogResult |
Cancel |
|
|
На форме диалогового окна работы с логарифмом по основанию «А» (LogA_F) потребуются компоненты:
X_L класса Label для подписи компонента X_TB;
39
X_TB класса TextBox для ввода аргумента;
A_L класса Label для подписи компонента A_TB;
A_TB класса TextBox для ввода основания;
Ok_B класса Button для подтверждения добавления или редактирова-
ния;
Cancel_B класса Button для отмены добавления или редактирования. Установим следующие значения свойств компонентов (таблица 11):
Таблица 11 – Значения свойств компонентов диалогового окна для работы с логарифмом по основанию «А»
Компонент.Свойство |
Значение |
LogA_F.FormBorderStyle |
FixedDialog |
|
|
LogA_F.AcceptButton |
Ok_B |
|
|
LogA_F.CancelButton |
Cancel_B |
|
|
LogA_F.MinimizeBox |
false |
|
|
LogA_F.MaximizeBox |
false |
|
|
LogA_F.ShowInTaskbar |
false |
|
|
X_L.Text |
Ар&гумент |
A_L.Text |
Ос&нование |
Ok_B.Text |
Ok |
Ok_B.DialogResult |
OK |
|
|
Cancel_B.Text |
Отм&ена |
Cancel_B.DialogResult |
Cancel |
|
|
Опишем событие FormClosing формы Log10_F:
private void Log10_F_FormClosing(object sender, FormClosingEventArgs e)
{
/* Проверку следует проводить только при нажатии кнопки "Ok" */ if (DialogResult == DialogResult.OK)
try
{
/* Попытка перевода строки в число. Если перевод не
возможен, то возникнет исключительная ситуация */ double n = Convert.ToDouble(X_TB.Text);
/* Если число меньше или равно нулю, то вызов исключительной ситуации */
if (n <= 0)
throw new Exception(
"Аргумент должен быть положительным числом");
}
/* Обработка ошибки перевода строки в число */ catch (FormatException)
{
40
/* При возникновении исключительной ситуации блокировка
закрытия формы, перевод фокуса на компонент ввода и выдача сообщения об ошибке */
e.Cancel = true; X_TB.Focus();
MessageBox.Show("Аргумент должен быть числом", "Ошибка");
}
/* Обработка других ошибок */ catch (Exception E)
{
e.Cancel = true; X_TB.Focus();
MessageBox.Show(E.Message, "Ошибка");
}
}
Опишем событие Shown формы Log10_F:
private void Log10_F_Shown(object sender, EventArgs e)
{
X_TB.Focus();
}
Аналогично описываются события для формы LogA_F.
Опишем базовый класс TFunction и классы-наследники TLog10 и TLogA в отдельном модуле, который добавим в программу через меню «Проект → Добавить новый элемент → Файл с текстом программы». Классы должны быть описаны в том же пространстве имен, что и основная программа. Также должно быть подключено необходимое пространство имен.
using System;
namespace ...
{
/* Базовый класс создадим абстрактным, т.к. он будет иметь абстрактный метод расчета функции */
abstract public class TFunction
{
public double X; // Базовый параметр
/* Конструктор с параметром */ public TFunction(double NewX)
{
X = NewX;
}
/* Базовая функция должна быть абстрактной, т.к. базовый класс
не знает, как произвести расчет */ abstract public double Calc();
}
41
public class TLog10 : TFunction
{
/* Конструктор с параметром, вызывающий конструктор класса-родителя */
public TLog10(double NewX) : base (NewX)
{
}
/* Реализация базовой функции */ public override double Calc()
{
return Math.Log10(X);
}
/* Функция строкового представления класса */ public override string ToString()
{
return "Log10("+X+")";
}
}
public class TLogA : TFunction
{
public double A; // Дополнительный параметр
/* Конструктор с двумя параметрами, вызывающий конструктор класса-родителя */
public TLogA(double NewX, double NewA) : base (NewX)
{
A = NewA;
}
/* Реализация базовой функции */ public override double Calc()
{
return Math.Log(X,A);
}
/* Функция строкового представления класса */ public override string ToString()
{
return "LogA("+X+","+A+")";
}
}
}
Опишем событие Click кнопки Add_B:
private void Add_B_Click(object sender, EventArgs e)
{
/* Определение вида добавляемого элемента */
if (Log10_RB.Checked) // Добавляется десятичный логарифм
{
Log10_F Dialog = new Log10_F();
Dialog.Text = "Добавление Log10";
Dialog.X_TB.Text = "";
if (Dialog.ShowDialog() == DialogResult.OK)
42
{
TLog10 Func = new TLog10(Convert.ToDouble( Dialog.X_TB.Text));
Spisok_LB.Items.Add(Func);
}
}
else // Добавляется логарифм по основанию “A”
{
/* Создание формы и работа с ней */
...;
}
}
Опишем событие Click кнопки Change_B:
private void Change_B_Click(object sender, EventArgs e)
{
if (Spisok_LB.SelectedIndex >= 0)
{
/* Проверка вида выбранного логарифма */
if (Spisok_LB.SelectedItem is TLog10) // Десятичный
{
/* Получение объекта */
TLog10 Func = Spisok_LB.SelectedItem as TLog10; /* Работа с формой десятичного логарифма */ Log10_F Dialog = new Log10_F();
Dialog.Text = "Изменение Log10"; Dialog.X_TB.Text = Func.X.ToString();
if (Dialog.ShowDialog() == DialogResult.OK)
{
Func.X = Convert.ToDouble(Dialog.X_TB.Text); Spisok_LB.Items[Spisok_LB.SelectedIndex] = Func;
/* После изменения требуется пересчитать результат */ Result_TB.Text = Func.Calc().ToString();
}
}
else
{
/* Работа с формой логарифма по основанию “А” */
...;
}
}
else
MessageBox.Show("Не выбран элемент в списке", "Информация");
}
Опишем событие Click кнопки Del_B:
private void Del_B_Click(object sender, EventArgs e)
{
if (Spisok_LB.SelectedIndex >= 0)
{
43
/* Производится удаление выбранной строки, работа по
блокировке недопустимых действий и очистка строки результата */
...;
}
else
MessageBox.Show("Не выбран элемент в списке", "Информация");
}
Опишем событие SelectedIndexChanged компонента Spisok_LB:
private void Spisok_LB_SelectedIndexChanged( object sender, EventArgs e)
{
/* При выборе строки в списке производится разрешение
доступных действий и вывод значения функции для объекта, связанного с выбранной строкой */
...;
}
Внешний вид и пример работы программы показаны на рисунке 8.
Рисунок 8 – Внешний вид и пример работы программы (основная форма и диалоговые окна), реализующей работу с иерархией классов
44