Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Более сложные преобразования типов




Else

Else

Else

Else

Else

Else

Else

Else

Старшинство тузов и использовать козырную масть.

Конструктор не по умолчанию. Позволяет устанавливать наивысшее

Конструктор не по умолчанию. Позволяет использовать козырную масть.

Старшинство тузов.

Конструктор не по умолчанию. Позволяет устанавливать наивысшее

public Deck(bool isAceHigh): this()

{

Card.isAceHigh = isAceHigh;

}

public Deck(bool useTrumps, Suit trump): this()

{

Card.useTrumps = useTrumps;

Card.trump = trump;

public Deck(bool isAceHigh, bool useTrumps, Suit trump): this()

{

Card. isAceHigh = isAceHigh;::

Card. useTrumps = useTrumps;

Card. trump = trump;

}

Каждый из этих конструкторов определен с использованием синтаксиса: this(), поэтому во всех случаях первым будет вызываться конструктор по умолчанию, который будет инициализировать колоду. Далее мы добавляем перегрузку операторов (и предлагаемые переопределения) в класс Card:

public Card(Suit newSuit, Rank newRank)

{

suit = newSuit;

rank = newRank;

}

public static bool operator ==(Card card1, Card card2)

{

return (card1.suit == card2.suit) && {card1.rank == card2.rank);

public static bool operator!=(Card card1, Card card2)

return!(card1 == card2);

}

public override bool Equals(object card)

{

return this = = (Card)card;

}

public override int GetHashCode()

{

return 13*(int)rank + (int)suit;

}

public static bool operator >(Card card1, Card card2)

{

if (card1.suit == card2.suit)

{

if (isAceHigh)

return (card1.rank > card2.rank) ^ (card2.rank == Rank.Ace);

return (card1.rank > card2.rank);

}

{

if (useTrumps && (card2.suit == Card.trump))

return false;

}

public static bool operator >=(Card card1, Card card2)

{

if (card1.suit == card2.suit)

{

if (isAceHigh)

return (card1.rank >= card2.rank) ^ (card2.rank == Rank.Ace);

return (card1.rank >= card2.rank);

}

{

if (useTrumps && (card2.suit == Card.trump))

return false;

return true;

}

public static bool operator <=(Card card1, Card card2)

{

return!(cardl > card2);

}

По этому коду у нас нет особых замечаний, за исключением, пожалуй несколько усложненного способа использования логического оператора OR(^). Он применяется, например, при перезагрузке оператора >.Если шаг за шагом пройти этот код, то можно понять, каким образом он работает и почему в данном случае необходим именно он.

Мы производим сравнение сразу двух карт – card1 и card2. Причем предполагается, что карта card1 была сыграна первой. Это важно в том случае, если мы используем козырные карты, поскольку козырная карта бьет некозырную, даже когда последняя старше. Естественно, если обе карты оказываются одной масти, то уже не имеет значения, является ли данная масть козырной или нет, поэтому именно эта проверка осуществляется первой:

public static bool operator >(Card card1, Card card2)

{

if (card1.suit == card2.suit)

{

Если статический маркер isAceHigh имеет значение true, то в этом случае мы лишены возможности сравнивать старшинство карт непосредственно по их значению в перечисляемом типе Rank, поскольку старшинство туза в этом типе равно 1, (то есть ниже, чем старшинство всех остальных карт).Именно здесь, мы можем очень эффективно использовать оператор ^. Выполняется два сравнения: одно по старшинству, и одно на предмет того, не является ли данная карта тузом. Результаты сравнения могут быть такими:

• если карта card1 старше, чем card2, и карта card2 не является тузом, то card1 старше, чем card2;

• если карта card1 старше, чем card2, и карта card2 является тузом то card2 старше, чем card1;

• если карта card1 младше card2 и не является тузом то card2 старше, чем card1;

• если карта card1 младше card2 и является тузом то card1 старше, чем card2.

 

Все вышесказанное можно представить в виде таблицы, расположенной снизу

 

сard1 > card2 card2.rank = = Rank.Ace сard1 старше, чем card2?
true false true
true true false
false false false
false true true

 

Напоминаем вам, что оператор XOR работает аналогично тому, как представлено в следующей таблице

В данном случае логика оказывается идентичной, поэтому использование этого оператора позволяет получить требуемый результат:

if (isAceHigh)

return(card1.rank > card2.rank)^(card2.rank = = Rank.Ace);

 

Однако в том случае, если isAceHigh имеет значение false, мы вполне можем положиться на старшинство карты, что позволяет упростить выполнение операции:

return (card1.rank > card2.rank);

Остальная часть кода относится к тому случаю, когда карты card1 и card2 имеют разные масти. При этом оказывается важным статический маркер useTrumps. Если он имеет значение true и карта card2 — козырной масти, то мы можем совершенно определенно утверждать, что карта card1 не является козырной (так как эти карты разных мастей), а поскольку козыри всегда старше, то карта card2 оказывается более старшей:

{

if (useTrumps && (card2.suit == Card.trump))

return false;

Если карта card2 не является козырной (т. е. маркер useTrumps имеет значение false), то в этом случае более старшей оказывается карта card1, поскольку именно она была сыграна первой:

return true;

Еще один оператор (>=) использует аналогичный код, а все остальное совсем просто, поэтому мы не будем вдаваться в подробности.

Следующий простой клиентский код тестирует эти операторы (для этого код следует поместить в функцию Main () клиентского проекта точно так же, как мы поступали с клиентским кодом в предыдущих примерах с использованием CardLib):

Card.isAceHigh = true;

Console.WriteLine("Aces are high."); //Тузы имеют наивысшее старшинство. //

Card.useTrumps = true;

Card.trump = Suit.Club;;

Console.WriteLine("Clubs are trumps."); // Козырь — трефы. //

Card card1, card2, card3, card4, card5;

Card1 = new Card (Suit. Club, Rank. Five); // пятерка треф //

card2 = new Card(Suit.Club, Rank.Five); //пятерка треф //

card3 = new Card (Suit.Club, Rank. Ace); // туз треф //

card4 - new Card (Suit. Heart, Rank. Ten); // десятка червей //

card5 = new Card (Suit.Diamond, Rank. Ace); // туз бубен //

Console.WriteLine(“(0) == (1)? (2)”),

Card1.ToString(), card2.ToString(), card1==card2);

Console. WriteLine{“(0!= {1}? {2}”,

Card1.ToString (), card3.ToString(), card1!=card3);

Console.WriteLine(“(0).Equals((1))? (2)”,

Card1.ToString(), card4.ToString(), card1. Equals (card4));

Console.WriteLine(“Card.Equals((0), (1))? (2)”,

card3.ToString(), card4.ToString(),Card.Equals(card3, card4));

Console.WriteLine(“(0) > (1)? (2)”,

Card1.ToString(), card2.ToString(),card1 > card2);

Console.WriteLine{“(0) <= (1)? (2)”,

Card1.ToString(), card3.ToString(), card1 <= card3);

Console.WriteLine( (0) > (1)? (2)” ,

Card1.ToString(), card4.ToString(), card1 > card4);

Console.WriteLine{“(0) > (1)? (2)”,

card4.ToString(), card1.ToString(), card4 > card1);

Console.WriteLine(“(0) > (1)? (2)”,

card5.ToString (), card4.ToString (),card5 > card4);

Console.WriteLine(“(0) > (1)? (2)”,

card4.ToString(), card5.ToString(), card4 > card5);

Будут получены следующие результаты:

 
 

 

 


В каждом случае используемые операторы учитывают установленные нами правила. Это очень хорошо видно по последним четырем строкам вывода, в которых демонстрируется, что козырная карта всегда бьет некозырную.

Теперь, когда вы знаете, каким образом описываются операторы преобразования типов, настала пора увенчать ваше знакомство с этой темой рассмотрением некоторых дополнительных возможностей языка С#. В этом разделе мы будем изучать:

• Упаковку и распаковку — преобразования между ссылочными и значимыми типами.

• Оператор is, который используется для проверки того, является ли конкретная переменная переменной данного типа или совместимой с данным типом.

• Оператор as, который используется для преобразования переменной в указанный тип несколько иным способом, нежели при изменении типа.




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


Дата добавления: 2014-01-04; Просмотров: 536; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.029 сек.