Операции преобразования типа

ПРИМЕЧАНИЕ

Бинарные операции

Можно определять в классе следующие бинарные операции:

+ - * / % & I ^ «» ==

!= > < >= <=

Операций присваивания в этом списке нет.

Синтаксис объявителя бинарной операции:

тип operator бинарная_операция (параметр1, параметр2)

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

public static MyProject operator + (MyProject ml, MyProject m2)

public static bool operator == (MyProject ml, MyProject m2)

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

Операции == и! =, > и <, >= и <= определяются только парами и обычно возвраща­ют логическое значение. Чаще всего в классе определяют операции сравнения на равенство и неравенство для того, чтобы обеспечить сравнение объектов, а не их ссылок, как определено по умолчанию для ссылочных типов.

Добавим в уже существующий класс Vector перегрузки различных бинарных операций:

class Vector

{

public static Vector operator -(Vector a) // перегрузка унарного минуса

{

Vector b = new Vector(-a.X, -a.Y);

return b;

}

public static Vector operator +(Vector a, Vector b) // перегрузка бинарного плюса

{

Vector c = new Vector(a.X+b.X, a.Y+b.Y);

return c;

}

public static Vector operator -(Vector a, Vector b)// перегрузка бинарного минуса

{

return a + (-b);

}

public static Vector operator *(Vector a, Vector b)// перегрузка умножения

{

Vector d = new Vector(a.X * b.X, a.Y * b.Y);

return d;

}

public static bool operator <=(Vector a, Vector b)//перегрузка операции сравнения

{

if (a.Length <= b.Length)

{

return true;

}

else return false;

}

public static bool operator >=(Vector a, Vector b)//перегрузка операции сравнения

{

if (a.Length < b.Length)

{

return false;

}

else return true;

}

  • В этом классе была реализована перегрузка таких операций как:
  • Унарное вычитание (вычисление вектора, обратного данному),
  • Бинарное сложение (сумма двух векторов),
  • Бинарное вычитание (разность двух векторов),
  • Бинарное умножение (произведение двух векторов),
  • Сравнение;

В перегруженных методах для объектов применяется индексатор. Для повышения эффективности можно обратиться к закрытому полю-массиву и непосредственно,

например: temp.a[i] = х + y.a[i].

Далее представим работу программы содержащую в себе класс Vector:

Добавим 1-ый вектор:

Добавим 2-ой вектор:

Выбрав нужные операции. Получаем результат:

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

Синтаксис объявите­ля операции преобразования типа:

implicit operator тип (параметр) // неявное преобразование

explicit operator тип (параметр) // явное преобразование

Эти операции выполняют преобразование из типа параметра в тип, указанный в заголовке операции. Одним из этих типов должен быть класс, для которого определяется операция. Таким образом, операции выполняют преобразование либо типа класса к другому типу, либо наоборот. Преобразуемые типы не долж­ны быть связаны отношениями наследования. Примеры операций преобразова­ния типа для класса Monster:

public static implicit operator int(Monster m)

{

return m.health;

}

public static explicit operator Monster(int h)

{

return new Monster(h, 100, “FromInt”);

}

Ниже приведены примеры использования этих преобразований в программе. Не надо искать в них смысл, они просто иллюстрируют синтаксис:

Monster Masha = new Monster(200, 200, “Masha”);

int i = Masha; // неявное преобразование

Masha = (Monster) 500; // явное преобразование

Неявное преобразование выполняется автоматически:

- при присваивании объекта переменной целевого типа, как в примере;

- при использовании объекта в выражении, содержащем переменные целевого типа;

- при передаче объекта в метод на место параметра целевого типа;

- при явном приведении типа.

Явное преобразование выполняется при использовании операции приведения типа. Все операции класса должны иметь разные сигнатуры. В отличие от других ви­дов методов, для операций преобразования тип возвращаемого значения вклю­чается в сигнатуру, иначе нельзя было бы определять варианты преобразования данного типа в несколько других. Ключевые слова implicit и explicit в сигнату­ру не включаются, следовательно, для одного и того же преобразования нельзя определить одновременно явную и неявную версии.

Неявное преобразование следует определять так, чтобы при его выполнении не возникала потеря точности и не генерировались исключения. Если эти ситуации возможны, преобразование следует описать как явное.

Контрольные вопросы по теме «Перегрузка операций»:

1. Что называется перегрузкой операции?

2. Синтаксис объявления перегруженной операции.

3. Какие спецификаторы используются при описании перегруженных операций?

4. Можно ли вводить новые обозначения для собственных операций?

5. Как передаются параметры в операцию-функцию?

6. Могут ли передаваться ссылочные (ref) и выходные (out) параметры в перегруженные операции?

7. Какое условие должно соблюдаться для сигнатуры всех операций классов?

8. Какие виды перегруженных операций классов существует в C#?

9. Какие унарные операции можно переопределять?

10. Синтаксис объявителя перегруженной унарной операции.

11. Какой тип должен иметь параметр, передаваемый в перегруженную унарную операцию?

12. Какой тип должна возвращать перегруженная операция-функция для операций +, -,!, ~?

13. Какой тип должна возвращать перегруженная операция-функция для операций ++, --?

14. Какой тип должна возвращать перегруженная операция-функция для операций true, false?

15. Различаются ли префиксный и постфиксный инкремент (декремент) при перегрузке операции?

16. Какие бинарные операции можно переопределять в классе?

17. Синтаксис объявителя перегруженной бинарной операции.

18. Какой тип могут иметь параметры, передаваемые в перегруженную бинарную операцию.

19. Величину какого типа может возвращать перегруженная бинарная операция?

20. Можно ли перегрузить операцию присваивания?

21. Дать определение операции преобразования типа.

22. Синтаксис объявителя операции неявного преобразования типа.

23. Синтаксис объявителя операции явного преобразования типа.

24. Могут ли преобразуемые типы быть связаны отношениями наследования?

25. Семантика операции преобразования типа.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: