Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
7 семестр / Учебники / Все лекции С# / Все лекции С# / Лекция 18. Перегрузка операций.doc
Скачиваний:
166
Добавлен:
24.02.2016
Размер:
125.44 Кб
Скачать

Пример перегрузки бинарных операций на примере класса

Одномерный массив”

//Перегружает операция сложения(+) либо двух массивов, либо массива и целого числа (то есть к //каждому элементу массива будет прибавлено это число)

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. В основной программе использовать операции сравнения: «==», «!=» и т.д.

Обычно операции сравнения перегружаются только парами.

Чаще всего в классах при перегрузке операции сравнения обеспечивают сравнения значений экземпляров класса, а не их ссылок.