Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование / Программирование в среде Visual C# (Часть 2).pdf
Скачиваний:
164
Добавлен:
27.05.2015
Размер:
1.41 Mб
Скачать

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