Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




Public class AddClassl

Public class AddClass1

{

public int val;

public static bool operator >=(AddClass1 op1, AddClass1 op2)

{

return (opl.val >= op2.val);

}

public static bool operator <(AddClass1 op1, AddClass1 op2)

{

return!(opl.val >= op2.val);

}

// Необходимо также реализовать операторы <= и >

}

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

Все вышесказанное относится и к операторам = = и! =, однако для них часто имеет смысл переопределение функций Object.Equals () и Object.GetHashCode(), поскольку обе они могут использоваться для сравнения объектов. Переопределяя эти методы, мы получаем возможность гарантировать, что независимо от методов, применяемых пользователями данного класса, полученные результаты будут одинаковыми. Это не является необходимым, но это стоит сделать ради завершенности. Для этого потребуются следующие нестатические переопределенные методы:

{

public int val;

public static bool operator ==(AddClass1 op1, AddClass1 op2)

{

return (opl.val == op2.val);

}

public static bool operator!=(AddClass1 op1, AddClass1 op2)

{

return!(op1 == op2);

}

public override bool Equals(object op1)

{

return val == ((AddClass1)op1).val;

}

public override int GetHashCode()

{

return val;

}

}

Обратите внимание, что функции Equals () передается параметр типа object. Такая сигнатура оказывается необходимой, иначе получится, что мы перегружаем этот метод, вместо того чтобы переопределять его, и реализация по умолчанию по-прежнему будет доступна пользователям данного класса. Это означает, что для получения необходимого результата нам потребуется приведение типов (хотя для придания коду большей стройности могут понадобиться дополнительные действия, поскольку приведенный выше пример не будет работать в тех случаях, когда параметр op1 не является экземпляром класса AddClass1 или экземпляром производного от него класса).

Функция GetHashCode() применяется для получения значения типа int, уникального для данного экземпляра объекта и зависящего от его состояния. В данном случае использование поля val оказывается вполне допустимым, поскольку оно также имеет значение типа int.

Помимо перегрузки математических операторов, продемонстрированной выше, существует возможность определять как неявное, так и явное преобразование типов. Это оказывается необходимым в том случае, если мы хотим выполнять преобразования между типами, не имеющими между собой отношений, например, когда они не связаны иерархией наследования и не имеют общих интерфейсов.

Пусть мы описали неявное преобразование между классом convclass1 и классом convclass2. Это означает, что теперь можно написать следующий код:

convclassl op1 = new convclass1();

convclass2 op2 = op1;

В качестве альтернативы мы можем описать явное преобразование, которое будем вызывать с помощью следующего кода:

convclass1 op1 = new convclass1();

convclass2 op2 = (convclass2) op1;

Давайтев качестве примера рассмотрим следующий код:




Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 327; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.