В некоторых классах используются фрагменты кода (блоки), в заголовках которых используется имя класса (но не конструктор) после которого, до круглых скобок формальных параметров, используется служебное слово operator. С помощью этого слова обозначается механизм перегрузки операций, который позволяет использовать в обычных математических выражениях переменные типа класс. Например, если для класса «студент» перегружена операция сложения (operator+) и в программе созданы два объекта типа «студент» – ct1 и ct2, то можно записать выражение ct1 + ct2.
Что означает сложение двух объектов? Может быть, мы объединяем их имена или суммируем возраст?
Для этих целей и используется перегрузка операций, которая четко прописывает, что должно суммироваться при суммировании двух объектов, например, необходимо суммировать их оценки.
Служебное слово operator указывает, что осуществляется перегрузка операции, а операция «+», что перегружается операция сложения.
Определение собственных операций класса с помощью указания operator называют перегрузкой операций. Перегрузка обычно применяется для классов, описывающих математические или физические понятия, то есть таких классов, для которых семантика операций делает программу более понятной.
|
|
Перегрузка операции класса описываются с помощью методов специального вида (функций - операций).
Формат записи перегрузки операции имеет следующий вид:
спецификаторы имя класса operator имя операции (формальные параметры) {тело }
В качестве спецификаторов обычно одновременно используются ключевые слова public и static. Кроме того, операцию можно объявить как внешнюю (extern).
Тело операции определяет действия, которые выполняются при использовании операции в выражении. Тело представляет собой блок, аналогичный телу других методов класса.
Например:
public static int operator+ (Stydent S1, Stydent S2)
{
return S1.Ocenka + S2.Ocenka;
}
Если мы определили перегружаемую операцию для «+», то это не означает, что мы определили перегрузку операции «++» или «+=». Это другие операции и их необходимо определять самостоятельно.
Если мы вводим перегружаемую операцию для некоторого класса, то ее действия должны быть ограничены только данными этого класса.
Необходимо отметить, что перегрузка операций не создает новые операции, а только адаптирует существующие к данным типа класс.
При описании перегрузки операций необходимо соблюдать следующие правила:
– операция должна быть описана как открытый статический метод класса (спецификаторыpublic static);
– формальные параметры в операцию должны передаваться по значению (то есть не должны предваряться ключевыми словами ref или out);
|
|
– форматы записей всех операций класса должны различаться.
Перегрузка операций обычно используется с целью обеспечения более естественного синтаксиса выражений для типов, определяемых пользователем.
Пример использования перегрузки операции для подсчета суммы оценок первых двух студентов:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1: Form
{
public class Stydent
{
int Ocenka;
string Name;
public string ss;
public int Aa
{
get { return Ocenka;}
set {if (value>=2 && value <=5) Ocenka = value; else ss="Вводите правильно значение оценки \r\n";}
}
public void Vvod(string name)
{
Name = name;
}
public static int operator+ (Stydent S1, Stydent S2)
{
return S1.Ocenka + S2.Ocenka;
}
}
public Stydent[] styd = new Stydent[5];
public static int n=0;
public Form1()
{
InitializeComponent();
textBox1.Text = "";
n = 0;
}
private void button1_Click(object sender, EventArgs e)
{
int Oc;
string fio,In;
Stydent st = new Stydent();
fio = textBox2.Text;
st.Vvod(fio);
In = textBox3.Text;
Oc = Convert.ToInt32(In);
st.Aa = Oc;
styd[n] = st;
textBox1.AppendText("Имя студента " + fio + " Его оценка = " + styd[n].Aa.ToString() +"\r\n");
if (st.Aa!= 0) n++;
if (n == 2) textBox1.AppendText("Сумма оценок двух студентов = " + (styd[0] + styd[1]).ToString() + "\r\n");
}
}
}
Работа программы изображена на рисунке 8.3.
Рисунок 8.3 – Пример перегрузки операции сложения
Вопросы для самопроверки
1 Для чего предназначен конструктор с умолчанием?
2 Для чего предназначен конструктор с заданием параметров?
3 Как называется процесс определения нескольких методов с одинаковыми именами?
4 Как называются несколько конструкторов одного класса?
5 Когда вызывается деструктор класса tka?
6 Как обычно называется метод, если тип его возвращаемого значения объявлен void?
7 Как должен заканчиваться в языке С# метод если его тип не void?
8 Какие формальные параметры метода С# называются параметры-ссылки?
9 Как называется объединение в одной структуре полей и методов их обработки?
10 Какой механизм используется в классах для доступа к «закрытым» полям класса?