Программирование >>  Программирование с использованием ajax 

1 ... 100 101 102 [ 103 ] 104 105 106 ... 396


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));



1 ... 100 101 102 [ 103 ] 104 105 106 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика