Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Перегрузка операторов true и false
Ключевые слова true и false можно также использовать в качестве унарных операторов для целей перегрузки. Перегружаемые варианты этих операторов позволяют определить назначение ключевых слов true и false специально для создаваемых классов. После перегрузки этих ключевых слов в качестве унарных операторов для конкретного класса появляется возможность использовать объекты этого класса для управления операторами if, while, for и do-while или же в условном выражении?.
Операторы true и false должны перегружаться попарно, а не раздельно. Ниже приведена общая форма перегрузки этих унарных операторов: public static bool operator true(тип_параметра операнд) { // Возврат логического значения true или false. } public static bool operator false(тип_параметра операнд) { // Возврат логического значения true или false. } Обратите внимание на то, что и в том и в другом случае возвращается результат типа bool. class MyArr { // Координаты точки в трехмерном пространстве public int x, y, z;
public MyArr(int x = 0, int y = 0, int z = 0) { this.x = x; this.y = y; this.z = z; }
// Перегружаем логический оператор == public static bool operator ==(MyArr obj1, MyArr obj2) { if ((obj1.x == obj2.x) & & (obj1.y == obj2.y) & & (obj1.z == obj2.z)) return true; return false; }
// Теперь обязательно нужно перегрузить логический оператор! = public static bool operator! =(MyArr obj1, MyArr obj2) { if ((obj1.x! = obj2.x) || (obj1.y! = obj2.y) || (obj1.z! = obj2.z)) return false; return true; }
// Перегружаем оператор false public static bool operator false(MyArr obj) { if ((obj.x < = 0) || (obj.y < = 0) || (obj.z < = 0)) return true; return false; }
// Обязательно перегружаем оператор true public static bool operator true(MyArr obj) { if ((obj.x > 0) & & (obj.y > 0) & & (obj.z > 0)) return true; return false; } }
class Program { static void Main(string[] args) { MyArr myObject1 = new MyArr(x: 4, z: 5, y: 12); MyArr myObject2 = new MyArr(x: 4, z: 5, y: 12);
if (myObject1 == myObject2) Console.WriteLine(" Объекты равны");
if (myObject1) Console.WriteLine(" Все координаты объекта myObject1 положительны");
Console.ReadLine(); } }
В С# перегрузке подлежат только операторы &, | и!. Тем не менее, соблюдая определенные правила, можно извлечь также пользу из укороченных логических операторов & & и ||. Рассмотрим сначала простейший случай. Если не пользоваться укороченными логическими операторами, то перегрузку операторов & и | можно выполнять совершенно естественным путем, получая в каждом случае результат типа bool. Аналогичный результат, как правило, дает и перегружаемый оператор!: class MyArr { // Координаты точки в трехмерном пространстве public int x, y, z;
public MyArr(int x = 0, int y = 0, int z = 0) { this.x = x; this.y = y; this.z = z; }
// Перегружаем логический оператор & public static bool operator & (MyArr obj1, MyArr obj2) { if (((obj1.x > 0) & & (obj1.y > 0) & & (obj1.z > 0)) & ((obj2.x > 0) & & (obj2.y > 0) & & (obj2.z > 0))) return true; return false; }
// Перегружаем логический оператор! public static bool operator! (MyArr obj1) { if ((obj1.x > 0) & & (obj1.y > 0) & & (obj1.z > 0)) return false; return true; }
}
При таком способе перегрузки логических операторов &, | и! методы каждого из них возвращают результат типа bool. Это необходимо для того, чтобы использовать рассматриваемые операторы обычным образом, т.е. в тех выражениях, где предполагается результат типа bool. Напомним, что для всех встроенных в С# типов данных результатом логической операции должно быть значение типа bool. Поэтому вполне разумно предусмотреть возврат значения типа bool и в перегружаемых вариантах этих логических операторов. Но, к сожалению, такой способ перегрузки пригоден лишь в том случае, если не требуются условные логические операторы.
|