Файл: Описание особенностей создания интерфейсного класса на примере проекта Интеграл.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.01.2024
Просмотров: 24
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Описание особенностей создания интерфейсного класса на примере проекта Интеграл Предполагается, что класс Интегратор (библиотечный класс) разрабатывается третьим лицом для использования другими программистами. Объект этого класса получает ссылку на пользовательский класс, который может реализовывать ряд методов, в том числе и подынтегральную функцию. При этом класс Интегратор не устанавливает каких-либо требований на имя пользовательского класса, то есть пользовательский класс может иметь любое имя. Чтобы объект Интегратора мог вызвать метод-подынтегральную функцию, необходимо, чтобы этот метод имел сигнатуру, которая совпадала бы с вызовом метода в классе Интегратор. Однако встает вопрос, как проверить, что у пользовательского класса есть метод вычисления подынтегральной функции и что этот метод имеет требуемую сигнатуру? Для того чтобы пользовательский класс гарантированно реализовывал подынтегральную функцию, причем с помощью метода, имеющего заданную сигнатуру, достаточно потребовать чтобы пользовательский класс реализовывал интерфейс, описывающий заголовок такого метода. Этот интерфейс должен быть разработан третьим лицом совместно с классом Интегратор. В нашем случае такой интерфейс имеет имя IФормула. Таким образом, интерфейсный класс создается в интересах класса-поставщика услуг. Ссылки на пользовательские объекты передаются в Интегратор как объекты типа object, но перед вызовом метода-подынтегральной функции с помощью операции is делается проверка объекта на реализацию классом интерфейса IФормула. Если этот интерфейс не реализован, возбуждается исключение (в нашем случае оно имитируется с помощью метода MessageBox). Кроме метода, реализация которого предписывается интерфейсом, пользовательский класс содержит и свой метод ToString. Этим подчеркивается, что пользовательский класс-потребитель может иметь свою функциональность, не связанную с классом-поставщиком услуг и его интерфейсом. Рис. Реализация интерфейса пользовательским классом |
|
Проект |
using System; using System.Collections.Generic; using System.Text; namespace Интеграл { //Интерфейс, определяющий сигнатуру функции interface IФормула { double f(double x); } } |
using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; namespace Интеграл { //Вычисление приближенного значения определенного интеграла //методом прямоугольников class Интегратор { double нижний, //Нижний предел интегрирования верхний; //Верхний предел интегрирования int отрезки; //Количество отрезков object подинтегральная; //Интерфейсная ссылка на объект, //в котором реализована подинтегральная функция object первообразная; //Интерфейсная ссылка на объект, //в котором реализована первообразная public Интегратор(double нижний, double верхний, int отрезки, object подинтегральная, object первообразная) { this.нижний = нижний; this.верхний = верхний; this.отрезки = отрезки; this.подинтегральная = подинтегральная; this.первообразная = первообразная; } public double ВычислитьПриближенно() { if (!(подинтегральная is IФормула)) { //throw new Exception("Не реализован интерфейс IФормула для подинтегральной функции!"); MessageBox.Show("Не реализован интерфейс IФормула для подинтегральной функции!"); return 1.0; } double шаг, //Шаг интегрирования x, //Текущее значение аргумента функции сумма; //Сумма значений функции в середине отрезка шаг = (верхний - нижний) / отрезки; x = нижний + шаг * 0.5; сумма = 0; for (int i = 0; i < отрезки; i++) { сумма += ((IФормула)подинтегральная).f(x); //Вызов метода через интерфейсную ссылку x += шаг; } return сумма * шаг; } public double ВычислитьТочно() { return ((IФормула)первообразная).f(верхний) - ((IФормула)первообразная).f(нижний); } } } |
using System; using System.Collections.Generic; using System.Text; namespace Интеграл_{class_Первообразная2'>Интеграл_{class_Первообразная1'>Интеграл_{class_Формула2'>Интеграл_{class_Формула1'>Интеграл { class Формула1 : IФормула { //Реализация подинтегральной функции, заданной в интерфейсе public double f(double x) { return 2 * x; } // другой метод public override string ToString() { return "Подинтегральная функция: 2x"; } } } |
sing System; using System.Collections.Generic; using System.Text; namespace Интеграл { class Формула2 : IФормула { //Реализация подинтегральной функции, заданной в интерфейсе public double f(double x) { return x * x; } // другой метод public override string ToString() { return "Подинтегральная функция: x*х"; } } } |
using System; using System.Collections.Generic; using System.Text; namespace Интеграл { class Первообразная1:IФормула { //Реализация первообразной для первого интеграла public double f(double x) { return x*x; } // другой метод public override string ToString() { return "Первообразная: x*х"; } } } |
using System; using System.Collections.Generic; using System.Text; namespace Интеграл { class Первообразная2:IФормула { //Реализация первообразной для второго интеграла public double f(double x) { return (x * x * x) / 3.0; } // другой метод public override string ToString() { return "Первообразная: x*х*х/3"; } } } |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace Интеграл { public partial class Form1 : Form { public Form1() { InitializeComponent(); } object подинтегральная; object первообразная; Интегратор интегратор; private void radioButton_Click(object sender, EventArgs e) { double a, b; int k; a = double.Parse(textBox1.Text); b = double.Parse(textBox2.Text); k = int.Parse(textBox3.Text); if (radioButton1.Checked) { подинтегральная = new Формула1(); первообразная = new Первообразная1(); } else if (radioButton2.Checked) { подинтегральная = new Формула2(); первообразная = new Первообразная2(); } else { MessageBox.Show("Выберите подинтегральную функцию"); } интегратор = new Интегратор(a, b, k, подинтегральная, первообразная); label8.Text = ""; label9.Text = ""; double интеграл; // Приближенное вычисление интеграл = интегратор.ВычислитьПриближенно(); label8.Text = String.Format("{0:f3}", интеграл); // Точное вычисление интеграл = интегратор.ВычислитьТочно(); label9.Text = String.Format("{0:f3}", интеграл); } } } |