Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Перегрузка условных логических операторов
Для того чтобы применение условных логических операторов & & и || стало возможным, необходимо соблюсти следующие четыре правила: · В классе должна быть произведена перегрузка логических операторов & и |. · Перегружаемые методы операторов & и | должны возвращать значение того же типа, что и у класса, для которого эти операторы перегружаются. · Каждый параметр должен содержать ссылку на объект того класса, для которого перегружается логический оператор. · Для класса должны быть перегружены операторы true и false.
Если все эти условия выполняются, то условные логические операторы автоматически становятся пригодными для применения. Рассмотрим пример:
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 MyArr 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 obj1; return new MyArr(1, 1, 1); }
// Перегружаем логический оператор | public static MyArr 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 obj1; return new MyArr(1, 1, 1); }
// Перегружаем логический оператор! public static bool operator! (MyArr obj1) { if ((obj1.x > 0) & & (obj1.y > 0) & & (obj1.z > 0)) return false; return true; }
// Перегружаем оператор true public static bool operator true(MyArr obj) { if ((obj.x > 0) || (obj.y > 0) || (obj.z > 0)) return true; return false; }
// Перегружаем оператор false public static bool operator false(MyArr obj) { if ((obj.x > 0) & & (obj.y > 0) & & (obj.z > 0)) return false; return true; }
// Вспомогательный метод public static bool And(MyArr obj1, MyArr obj2) { if (obj1 & & obj2) return true; return false; }
}
Благодаря тому что все необходимые правила соблюдены, условные операторы становятся доступными для применения к объектам MyArr. Они действуют следующим образом. Первый операнд проверяется с помощью операторного метода operator true (для оператора ||) или же с помощью операторного метода operator false (для оператора & &). Если удается определить результат данной операции, то соответствующий перегружаемый оператор (& или |) далее не выполняется. В противном случае перегружаемый оператор (& или | соответственно) используется для определения конечного результата. Следовательно, когда применяется условный логический оператор & & или ||, то соответствующий логический оператор & или | вызывается лишь в том случае, если по первому операнду невозможно определить результат вычисления выражения. Описанный выше способ применения условных логических операторов может показаться, на первый взгляд, несколько запутанным, но если подумать, то в таком применении обнаруживается известный практический смысл. Ведь благодаря перегрузке операторов true и false для класса компилятор получает разрешение на применение условных логических операторов, не прибегая к явной их перегрузке. Это дает также возможность использовать объекты в условных выражениях. И вообще, логические операторы & и | лучше всего реализовывать полностью, если, конечно, не требуется очень узконаправленная их реализация.
|