Г. Шилдт - С#4.0 Полное руководство (1160795), страница 54
Текст из файла (страница 54)
овйпч зуасеиг Класс для хранения трехмерных координат. с1ава ТвгееО ) йпс х, у, хг // трехмерные координаты рпЫйс ТлгееО() ( х = у = х = О) ) риЫ1с ТнгееР)йпг 1, йпв 7, йпв Х) ( х = йг у = 7; г // Перегрузить логический оператор рпЬ11с явавйс Ьоо1 орегавог )(ТЛгееО ор1, ТЛгееО ор2) ( 15( ((ор1.х != О) ! ) (ор1.у != О) ) ) (ор1.г != О) ) ! ((ор2.х != О) )) (ор2.у != О) )) (ор2.г )= О)) ) гегогп лгое) е1яе геспгп Йа1яег // Перегрузить логический оператор й. роь1гс вгасйс ьоо1 орегагог й(тлгееО ор1, тлгееО ор2) ( 1Т( ((ор1.х != О) йй (ор1.у != О) йй (ор1.г 1= О) ) й ((ор2.х )= О) йй (ор2.у != О) йй (ор2.г (= О) ) ) гегогп ггие) е1ве геоогп Га1яег ) // Перегрузить логический оператор !.
роЬ11с воавйс Ьоо1 орегасог !(ТЛгееО ор) ( 10((ор.х )= О) () (ор.у != О) () (ор.г != О) ) геспгп Га1ве) е1яе геопгп Ггое) ) // Вывести координаты Х, у, 2. роЬ1гс чо1г( ЯЛом() ( Сопво1е.пггсеОТпе(х е ", " + у + ", " + г) ) ) ) а: ")г Ь: ")) с: ")( ТГ(!а) Сопяо1е.пггсевйпе("Точка а ложна."); га(!Л) сопяо1е.иг1сеЬгпе("Точка Ь ложна.")1 га(!с) Сопяо1е.иг1ое11пе("Точка с ложна."); Сопво1е.пг1се11пе() с1аяв Тгпеуа1веееио ( яоас1с чо1б Маго() ( ТЛгееО а = пем ТЛгееО(5, б, 7)г ТЛгееО Ь = пем ТЛгееО(10, 10, 10) ТЛгееО с = пем ТЛгееО(0, О, О); Сопво1е.Иг1ге("Координаты точки а.ЯЛом(); Сопяо1е.кггое("Координаты точки Ь.ЯЛом() ' Сопяо1е.пггсе("Координаты точки с.ЯЛом(); Сопяо1е.пггдеЬйпе(); Гааза 9. Перегрузка операторов 287 288 Часть ).
Язык С)г 11(а ь ь) сопао1е.нггсеьвпе("а а ь истинно."); е1зе Сопзо1е.нггпеьгпе("а Ь Ь ложно."); 11(а 6 с) Сопао1е.нг1геъьпе("а Ь с истинно.") е1зе Сопао1е.иг1пеъ1пе("а Ь с ложно."); 11(а ) Ь) Сопзо1е.нггпеььпе("а ) Ь истинно."); е1зе Сопао1е.игьсеъ1пе("а ( Ь ложно."); гт(а ) о) Сопао1е.иггпеъгпе("а ) с истинно.")! е1зе Сопво1е.нг1сеъгпе("а ) с ложно."); ) ) При выполнении этой программы получается следующий результат. Координаты точки а: 5, б, 7 Координаты точки Ь: 10, 10, 10 координаты точки с: О, О, 0 Точка о ложна. а а Ь истинно.
а $ с ложно. а ) Ь истинно. а ( с истинно. При таком способе перегрузки логических операторов а, ) и ) методы каждого из них возвращают результат типа Ьоо1. Это необходимо для того, чтобы использовать рассматриваемые операторы обычным образом, т.е. в тех выражениях, где предполагается результат типа Ьоо1. Напомним, что для всех встроенных в С)) типов данных результатом логической операции должно быть значение типа Ьоо1. Поэтому вполне разумно предусмотреть возврат значения типа Ьоо1 и в перегружаемых вариантах этих логических операторов.
Но, к сожалению, такой способ перегрузки пригоден лишь в том случае, если не требуются укороченные логические операторы. Как сделать укороченные логические операторы доступными для применения Для того чтобы применение укороченных логических операторов ь а и ) ) стало возможным, необходимо соблюсти следующие четыре правила. Во-первых, в классе должна быть произведена перегрузка логических операторов а и (. Во-вторых, перегружаемые методы операторов а и ) должны возвращать значение того же типа, что и у класса, для которого эти операторы перегружаются.
В-третьих, каждый параметр должен содержать ссылку на объект того класса, для которого перегружается логический оператор. И в-четвертых, для класса должны быть перегружены операторы с где и Та1зе. Если все эти условия выполняются, то укороченные логические операторы автоматически становятся пригодными для применения. В приведенном ниже примере программы показано, как правильно реализовать логические операторы ь и ( в классе тьгее)7, чтобы сделать доступными для применения укороченные логические операторы ь а и ( ). Глава 9. Перегрузка операторов 288 /* Более совершенный способ перегрузки логических операторов ), ) и Я для объектов класса ТЬгееб. Б этом варианте укороченные логические операторы яя и становятся доступныыи для применения автоматически. */ ияупц Буягеш; Класс для хранения трехмерных координат.
с1авя ТЬгееО ( Тпг х, у, г; // трехмерные координаты риЬ11с ТЬгееб() ( х = у = г = 0; ) риь11с тьгееО(гпг 1, Тпг 2, Тпг м) ( х = Тг у = Ог г = кг ) // Перегрузить логический оператор ) для укороченного вычисления. риЬ11с ягасгс ТЬгееб орегасог )(ТЬгееб ор1, ТЬгееб ор2) ( 11( ((ор1.х != 0) ( ( (ор1.у != 0) ) ) (ор1.г != 0) ) ((ор2.х ! — О) ) ) (ор2.у ! —. О) ) ) (ор2.г )= 0) ) ) гесигп пен ТЬгееб(1, 1, 1)г е1яе гесигп пен ТЬгееб(0, О, 0); Перегрузить логический оператор я для укороченного вычисления. риЬ11с ягасгс ТЬгееб орегасог я(ТЬгееб ор1, ТЬгееО ор2) ( 11( ((орт.х != 0) яя (ор1.у != 0) яя (ор1.г != 0)) я ((ор2.х != 0) яя (ор2.у != 0) ая (ор2.г != 0) ) ) гесигп лен ТЬгееб(1, 1, 1); е1яе гесигп пен ТЬгееО(0, О, О); ) // Перегрузить логический оператор !.
риЬ11с ясасгс Ьоо1 орегасог !(ТЬгееб ор) ( ТЕ(ор) гегигп Га1яег е1яе гесигп Сгие) ) // Перегрузить оператор Ггие. риЬ11с яиаизс Ьоо1 орегаиог Ггие(ТЬгееО ор) ( 11((ор.х != О) )) (ор.у )= О) )) (ор.г != 0)) гегигп ггие; // хотя бы одна координата не равна нулю е1яе гегигп га1яет // Перегрузить оператор Га1яе. риЬ11с ясасас Ьоо1 орегасог Еа1яе(ТЬгееР ор) ( 1Г((ор.х == 0) ая (ор.у == О) яа (ор.г == О)) гесигп Ггие; // все координаты равны нулю е1яе 290 Часть!. Язык С№ гегигп Еа1яе; Ввести координаты Х, Х, Е. роЬ11с чо1б ВЬон() ( Сопво1е.ХгусеЬТпе(х в ", " т у в ", " + я); ) ) с1авв Тгпера1веОеио ( ягас№с чо1с Иа1п() ( ТЬгееО а = пен ТЬгееО(5, 6, 7); ТЬгееО Ъ = пен ТЬгееО(10, 10, 10) ТЬгееО с = пен ТЬгееО(0, О, О)) Сопяо1е.Хг1ге("Координаты точки а: "); а.
ВЬон (); Сопво1е.ыггсе("Координаты точки Ь: "); Ь. Вдон (); Сопво1е.ыг1ге("Координаты точки с: "); с . БЬон () ." Сопяо1е.ыгвсеЫпе(); 11(а) Сопяо1е.иггсе11пе("Точка а истинна.") 11(Ь) Сопво1е.нг1сеОгпе("Точка Ъ истинна.") 11(с) Сопво1е.иггсеЫпе("Точка с истинна."! 11((а) Сопяо1е.иг1сеОТпе("Точка а ложна.") 11((Ь) Сопяо1е.ыг1сеЫпе("Точка Ь ложна.") 11()с) Сопяо1е.игввеЫпе("Точка с ложна.") Сопяо1е.ыгувеОТпе() сопво1е.хгвгеОТпе("применение логических операторов а и )")) 11(а й ь) сопяо1е.хггсе11пе("а в Ь истинно.")у е1яе Сопво1е.игусеЫпе("а й Ь ложно."); 11(а й с) сопяо1е.хггсе11пе("а в с истинно."); е1яе Сопяо1е.иг1се11пе("а в с ложно."); 11(а ( Ь) Сопво1е.иг1сед№пе("а ) Ь истинно."); е1яе Сопво1е.иг1ве11пе("а ( Ь ложно."); 11(а ( с) Сопво1е.иг1ве11пе("а ) с истинно."); е1яе Сопяо1е.иг№сеЫпе("а ) с ложно."); Сопво1е.иг1се11пе() // А теперь применить укороченные логические операторы.
Сопяо1е.ыгггеЬТпе("Применение укороченных" "логических операторов йя и (("); 11(а вв Ь) Сопво1е.ыг1ве11пе("а вв Ь истинно."); е1ве Сопво1е.нг1се51пе("а ВВ Ь ложно."); Гьава 9. Перегрузка операторов 291 ьг(а йь с) сопяо1е.хгйгеь1пе("а ьь с истинно."); е1яе Сопяо1е.кгьсе11пе("а ьй с ложно."); 1Т(а )) Ь) Сопяо1е.кгьяеььпе("а () Ь истинно."); е1яе. Сопяо1е.иггяеььпе("а )) Ь ложно.")," 1Е(а )) с) Сопяо1е.игьсеььпе("а (( с истинно."); е1яе Сопяо1е.иггсеььпе("а () с ложно."); ) Выполнение этой программы приводит к следующему результату.
Координаты точки а: 5, б, 7 Координаты точки Ъ: 10, 10, 10 Координаты точки с: О, О, 0 Точка а истинна Точка Ь истинна Точка с ложна. применение логических операторов ь и а й Ь истинно. а й с ложно. а ) Ь истинно. а ) с истинно. Применение укороченных логических операторов йй и )! а ьь Ь истинно. а ьь с ложно. а )( Ь истинно. а )) с истинно.
Рассмотрим более подробно, каким образом реализуются логические операторы й и ) . Они представлены в следующем фрагменте кода. // Перегрузить логический оператор ) для укороченного вычисления. рпЬ1гс ясаГ1с ТЬгееО орегасог )(ТЬгеео ор1, ТЬгеео ор2) ( ьг( ((ор1.х )= О) ) ) (ор1.у != О) ) ) (ор1.г != О) ) ((ор2.х != О) ) ) (ор2.у != О) () (ор2.г (= О) ) ) гесогп пен Тлгеео(1, 1, 1)7 е1яе гесогп пен Тлгеео(0, О, 0)г ) Перегрузить логический оператор й для укороченного вычисления. роь11с ягаг1с тьгеео орегагог ь(тьгеео ор1, тьгеео ор2) ( гГ( ((ор1.х != О) йь (ор1.у != О) йь (ор1.я != О]) ((ор2.х != О) ьь (ор2.у != О) ьь (ор2.г != О)) ) гегпгп печ ТЬгеео(1, 1, 1)г е1яе геспгп пеи ТЬгееО(0, О, О); 292 Часть ).
Язык С№ Прежде всего обратите внимание на то, что методы обоих перегружаемых логических операторов теперь возвращают объект типа ТЬгееР. И особенно обратите внимание на то, как формируется этот объект. Если логическая операция дает истинный результат, то создается и возвращается истинный объект типа ТпгееР, у которого хотя бы одна координата не равна нулю. Если же логическая операция дает ложный результат, то соответственно создается и возвращается ложный объект. Таким образом, результатом вычисления логического выражения а ь Ь в следующем фрагменте кода: зг(а а ь) сопяа1е.итьсеыпе("а я ь истинно."); е1яе Сопяо1е.итзвеътпе("а а Ъ ложно."); является объект типа ТпгееР, который в данном случае оказывается истинным. А поскольку операторы Ггсе и Та1яе уже определены, то созданный объект типа ТпгееР подвергается действию оператора Сгпе и в конечном итоге возвращается результат типа Ьоо1.
В данном случае он равен Ьгое, а следовательно, условный оператор ТТ успешно выполняется. Благодаря тому что все необходимые правила соблюдены, укороченные операторы становятся доступными для применения к объектам ТЬ хе с Р. Они действуют следующим образом. Первый операнд проверяется с помощью операторного метода орегасог ггпе (для оператора ) )) или же с помощью операторного метода орегагог йа1яе (для оператора ь ь).