Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Перегрузка операторов 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 и в перегружаемых вариантах этих логических операторов. Но, к сожалению, такой способ перегрузки пригоден лишь в том случае, если не требуются условные логические операторы.

 


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

mylektsii.su - Мои Лекции - 2015-2024 год. (0.008 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал