
- •Лекция 18. Перегрузка методов и операций в классах Перегрузка методов
- •Перегрузка операций
- •Перегрузка унарных операций
- •Пример перегрузки унарных операций на примере класса
- •Перегрузка бинарных операций
- •Public static тип_возвр_знач operator бинарная_операция (параметр1, параметр2),
- •Пример перегрузки бинарных операций на примере класса
- •Класс System.Object
- •Пример перегрузки операций сравнения с использованием стандартных методов класса Object
Пример перегрузки бинарных операций на примере класса
“Одномерный массив”
//Перегружает операция сложения(+) либо двух массивов, либо массива и целого числа (то есть к //каждому элементу массива будет прибавлено это число)
class MyArray
{
public MyArray(int size)
{
length =size;
a=new int[length];
}
public MyArray(params int [] mas)
{
length =mas.length;
a=new int[length];
for (int i=0;i<length;i++)
a[i]=mas[i];
}
//перегрузка бинарного оператора + - сложение двух массивов (как экземпляров класса)
public static MyArray operator +(MyArray x, MyArray y)
{
int all_len=x.length<y.length?x.length:y.length;
MyArray temp=new MyArray(all_len);
for (int i=0;i<all_len;i++)
temp[i]=x[i]+y[i]; //попробуйте temp.a[i]=x.a[i]+y.a[i]!!!
return temp;
}
//перегрузка бинарного оператора + - сложение массива и целого числа
public static MyArray operator +(MyArray x, int y)
{
MyArray temp=new MyArray(x.length);
for (int i=0;i<x.length;i++)
temp[i]=x[i]+y; //попробуйте temp.a[i]=x.a[i]+y!!!
return temp;
}
public static MyArray operator ++(MyArray x) //перегрузка унарного оператора ++
{
MyArray temp=new MyArray(x.length);
for (int i=0;i<length;i++)
temp[i]=++x.a[i];
return temp;
}
//индексатор, в случае выхода за рамки массива – генерируется исключение!
public int this [int i]
{
get {if (i>=0 && i<length) return a[i]; else throw new IndexOutOfRangeException();}
set { if (i>=0 && i<length) a[i]=value; else throw new IndexOutOfRangeException();}
}
public void Print(string name)
{
Console.WriteLine(name+”:”);
for (int i=0;i<length;i++)
Console.WriteLine(“\t”+a[i]);
Console.WriteLine();
}
public void Enter()
{
//в цикле - ввод элементов массива – реализуйте сами!
}
//данные класса – сам массив и его размерность
int [] a;
int length;
}
…Main()
{
try
{
MyArray a1=new MyArray(5,2,-1,1,-2);
a1.Print(“Первый массив ”);
MyArray a2=new MyArray(5);
a2.Enter();
a2.Print(“Второй массив ”);
a2++;
a2.Print(“Использование операции ++ для всех элементов массива”);
MyArray a3=a1+a2;
а3.Print(“Сумма массивов первого и второго”);
a1=a1+100;
a1.Print(“Первый массив плюс 100 ”);
//ТАК делать не желательно, так как результат будет не всегда верен!!!
a2+=++a2+1; //!!!! Операция += не перегружена, вместо этого выполняется:
//a2=(++a2+1)+a2(уже измененное!!!)
a2.Print(“(++a2+1), +a2”);
}
catch (Exception e)
{Console.WriteLine(e.Message);}
}…
Перегрузку операций можно осуществить с помощью открытых методов класса System.Object
Класс System.Object
Класс Object является корневым классом всей библиотеки объектов .NET и обеспечивает всех своих наследников всеми методами, которые они могут либо использовать без изменений, либо переопределять. Ниже перечислены открытые методы класса Object, которые программисты используют в своих классах:
public virtual bool Equals (object obj); - метод возвращает True или False в зависимости от того, ссылается ли параметр obj и вызывающий экземпляр класса на одну и ту же область памяти. Этот же метод можно использовать с двумя параметрами.
public virtual int GetHashCode (); -формирует хэш-код объекта и возвращает число, однозначно идентифицирующее объект. Это число может использоваться в различных структурах данных и алгоритмах библиотеки.
Обычно метод GetHashCode() перегружается, если используется перегрузка метода Equals().
public Type GetType();- возвращает текущий тип объекта, а не типссылки. Тип Type – это абстрактный базовый класс, который получает информацию (тип данных) об экземпляре класса не, как о ссылке, а как о простой переменной класса.
Для того, что бы в основной программе перегрузить операции сравнения с использованием методов класса objectнеобходимо:
1. Перегрузить метод Equals()
2. В данном методе использовать метод GetType()
3. Перегрузить метод GetHashCode()
4. В основной программе использовать операции сравнения: «==», «!=» и т.д.
Обычно операции сравнения перегружаются только парами.
Чаще всего в классах при перегрузке операции сравнения обеспечивают сравнения значений экземпляров класса, а не их ссылок.