|
Программирование >> Программирование с использованием ajax
else { if (card2.rank == Rank.Асе) return falser-else return (cardl.rank > card2.rank); □ Если тузы не являются старшей картой, тогда может сразу же выполняться сравнение значений, представляющих достоинство карт: else { return (cardl.rank > card2.rank); Остальной код заботится о ситуации, когда масть cardl и card2 не совпадает. Здесь важную роль играет статический флаг useTrumps. Если он имеет значение true и масть карты card2 является козырной, тогда точно можно сказать, что карта cardl козырем не является (поскольку масти этих двух карт не совпадают), а козыри всегда побеждают, так что карта card2 считается более высокой: else { if (useTrumps && (card2.suit == Card.trump)) return false; Если карта card2 не является козырем (или флаг useTrumps имеет значение false), тогда побеждает карта cardl, поскольку она была выложена на стол первой: else return true; Только в еще одной другой операции (а именно операции >=) используется подобный код; все остальные операции выглядят очень просто, поэтому рассказывать о них более подробно нет никакой необходимости. Следующий простой клиентский код позволяет протестировать все операции (чтобы испробовать его, поместите его в функцию Main () клиентского проекта, подобно тому, как делали это в клиентском коде, приведенном в предыдущих примерах CardLib): Card. IsAceHigh = truer-Console.WriteLine ( Aces are high. ); Тузы являются старшей картой Card.useTrumps = true; Card.trump = Suit.Club; Console.WriteLine( Clubs are trumps. ); Трефы являются козьфной мастью Card cardl, card2, card3, card4, card5; cardl = new Card(Suit.Club, Rank.Five); card2 = new Card(Suit.Club, Rank.Five); cards = new Card(Suit.Club, Rank.Ace); card4 = new Card(Suit.Heart, Rank.Ten) ; cards = new Card(Suit.Diamond, Rank.Ace); Console.WriteLine( {0} == {1} ? {2} , cardl.ToString0, card2.ToString(), cardl == card2); Console.WriteLine cardl.ToString Console.WriteLine cardl.ToString Console.WriteLine card3.ToString Console.WriteLine cardl.ToString Console.WriteLine cardl.ToString Console.WriteLine cardl.ToString Console.WriteLine card4.ToString Console.WriteLine cards.ToString Console.WriteLine card4.ToString Console.ReadKey() , ( {0} != {1} ? {2} , 0, card3.ToString() , cardl !=card3); ( {0}.Equals({l}) ? {2} , 0, card4.ToString0, cardl.Equals(card4)); ( Card.Equals({0}, {1}) ? {2} , 0, card4.ToString0, Card.Equals(card3, card4)); ( {0} > {1} ? {2} , 0, card2.ToString() , cardl > card2); ( {0} <= {1} ? {2} , 0, card3.ToString0, cardl <= card3); ( {0} > {1} ? {2} , 0, card4 .ToString 0 , cardl > card4) ; ( {0} > {1} ? {2} , 0, cardl.ToString 0 , card4 > cardl); ( {0} > {1} ? {2} , 0, card4.ToString0, cardS > card4); ( {0} > {1} ? [2]% 0, cards.ToString0, card4 > cardS); Результаты показаны на рис. 11.7. I m . /CJB gVCSh rp/Ch pier11Ch1lCariltibA:h1iCardCl nt/b<n/D*buQ/ Рис. 11.7. Тестирование перегруженных операций в CardLib В каждом случае операции применяются с учетом заданных правил. Это особенно заметно в четырех последних строках вывода, демонстрирующих, что козырные карты всегда бьют не козырные. Интерфейсы IComparable и IComparer Интерфейсы IComparable и IComparer являются стандартным способом для сравнения объектов в .NET Framework. Разница между ними описана ниже. □ Интерфейс IComparable реализуется в классе подлежащего сравнению объекта и потому позволяет выполнять сравнения только между этим и еще каким-то объектом. □ Интерфейс IComparer реализуется в отдельном классе и потому позволяет выполнять сравнения между любыми двумя объектами. Обычно код сравнения, который должен использоваться в классе по умолчанию, предоставляется с помощью интерфейса IComparable, а код сравнения, который не должен использоваться по умолчанию - с помощью других классов. Интерфейс IComparable поддерживает один единственный метод СотрагеТо О , который принимает объект. Его можно, например, реализовать таким образом, чтобы он позволял передавать ему объект Person и определять, является ли данный человек старше или младше текущего. На самом деле, этот метод возвращает значение int. так что еще можно сделать и так, чтобы он позволял определять, насколько именно старше или моложе является второй человек: if (personl.CompareTo(person2) == 0) { Console.WriteLine( Same age ); Того же возраста else if (personl.CompareTo(person2) > 0) { Console.WriteLine( person 1 is Older ); Первый человек старше else { Console.WriteLine( personl is Younger ); Первый человек моложе Интерфейс IComparer тоже предоставляет единственный метод Compare (), который принимает два объекта и возвращает целочисленный результат, точно так же, как метод CompareTo (). При наличии объекта, поддерживающего IComparer, можно применять такой код: if (personComparer.Compare (personl, person2) ==0) { Console.WriteLine( Same age ); Того же возраста else if (personComparer.Compare(personl, person2) > 0) { Console.WriteLine( person 1 is Older ); Первый человек старше else { Console.WriteLine( personl is Younger ); Первый человек моложе В обоих случаях параметры, предоставляемые методам, относятся к типу System. Object. Это означает, что сравниваться могут объекты любого типа, а это обычно требует выполнения перед возвратом результата какой-то операции по сравнению типов и, возможно даже, выдачи исключений в случае обнаружения того, что используемые типы являются неправильными. В состав .NET Framework входит используемая по умолчанию реализация интерфейса IComparer, предназначенная для класса по имени Comparer, который находится в пространстве имен System.Collections. Этот класс способен выполнять специфические для каждой культуры операции сравнения между простыми типами, а также любым типом, который поддерживает интерфейс IComparable. Его можно использовать, например, со следующим кодом: string firstString = First String ; string secondString = Second String ; Console.WriteLine( Comparing {0} and {1}, result: {2} , Результат сравнения строк firstString, secondString, Comparer.Default.Compare(firstString, secondString));
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |