Студопедия

КАТЕГОРИИ:


Архитектура-(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

Здесь располагалась удаленная строка кода.

Public class Deck

Namespace ChllCardLib

Осуществляется посредством InnerList.

Проверка, позволяющая определять, содержится ли в семействе

Set

Get

Public class Cards: CollectionBase

Summary description for Cards.

///</summary>

{

public void Add (Card newCard)

{

List.Add(newCard);

}

public void Remove (Card oldCard)

{

List.Remove(oldCard);

}

public Cards()

{

}

public Card this[int cardIndex]

{

{

return (Card)List[cardIndex];

}

{

List[cardIndex] = value;

}

}

//Cards конкретная карта. С этой целью осуществляется вызов метода

//Contains класса ArrayList для данного семейства, доступ к которому

public bool Contains(Card card)

{

return InnerList.Contains(card);

}

}

}

Теперь нам предстоит внести определенные изменения в файл Deck.cs, чтобы он мог использовать это новое семейство вместо массива:

using System;

{

{

private Cards cards = new Cards ();

public Deck()

{

for (int suitVal = 0; suitVal < 4; suitVal++)

{

for (int rankVal = 1; rankVal < 14; rankVal++)

{

cards. Add (new Card ((Suit) suitVal, (Rank) rankVal));

}

}

}

public Card GetCard(int cardNum)

{

if (cardNum >= 0 && cardNum <= 51)

return cards[cardNum];

throw (new System. ArgumentOutOf RangeException (“cardNum”,

cardNum, “Значение должно находиться в диапазоне между 0 и 51.”));

}

public void Shuffle()

{

Cards newDeck = new Cards();

bool[] assigned = new bool[52];

for (int i = 0; i < 52; i++)

{

int sourceCard=0;

bool foundCard = false;

Random sourceGen = new Random();

while (foundCard == false)

{

sourceCard = sourceGen.Next(52);

if (assigned[sourceCard] == false)

foundCard = true;

}

assigned[sourceCard] = true;

newDeck.Add(cards[sourceCard]);

}

cards = newDeck;

}

}

}

Обратите внимание, что при копировании исходных файлов из Ch10CardLib в Ch11CardLib необходимо изменить объявления пространства имен таким образом, чтобы они ссылались на Сh11CardLib; именно поэтому строка с объявлением пространства имен в коде также выделена. Это справедливо как для файла card.cs, так и для консольного приложения Ch10CardClient.

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

Клиентское консольное приложение Ch10CardClient для решения Chl0CardLib может работать с новой библиотекой; при этом результаты окажутся точно такими же, поскольку сигнатуры методов в Deck остались неизменными. Клиенты этой библиотеки классов теперь могут использовать класс семейства Сards, вместо того чтобы работать с массивами объектов типа Сard, например, при определении розданных игрокам карт в приложении для карточных игр.

Следующим предметом рассмотрения будет перегрузка операторов. Она позволяет применять стандартные операторы — такие как +, > и т. п.— в операциях над созданными нами классами. Это называется перегрузкой, поскольку мы используем нашу собственную реализацию работы этих операторов в тех случаях, когда они применяются для выполнения операций над параметрами определенных типов; во многом это аналогично тому, как перегружаются методы, когда передаются различные параметры методам с одним и тем же именем.

Перегрузка операторов оказывается весьма полезной, поскольку позволяет выполнять любые действия, которые мы определим при реализации перегрузки оператора. Они могут быть вовсе не так просты, как, скажем, "+ означает сложение двух данных операндов". Немного позже, при дальнейшем усовершенствовании библиотеки CardLib, нам встретится хороший пример такого подхода. Мы включим в нее такие реализации операторов сравнения, которые позволят сравнивать две карты, чтобы определить, какая из них бьет другую и берет взятку (этап карточной игры). Поскольку взятка во многих карточных играх зависит от мастей участвующих в ней карт, то эта задача оказывается не такой примитивной, чтобы просто сравнивать старшинство карт. Если вторая сыгранная карта отличается по масти от первой, то первая карта забирает взятку независимо от старшинства. Такая логика может быть реализована, если учитывать порядок следования двух операндов. Мы можем также ввести понятие козырной масти: козыри бьют все остальные масти даже в том случае, если это не первая сыгранная карта. Это означает, что если результат card1 > card2 равен true (т. е. card1 бьет card2, если card1 сыграна первой), из него совершенно не следует, что значение card2 > card1 есть false.

Если ни card1, ни card2 не являются козырями и масти их различны, то оба эти сравнения дадут значение true. Однако для начала давайте познакомимся с основным синтаксисом перегрузки операторов.

Операторы могут перегружаться с помощью включения в класс членов типа оператора (которые должны быть описаны как static). Для некоторых операторов возможны различные варианты использования (например, для оператора — он может использоваться и как унарный, и как бинарный), поэтому необходимо указывать, с каким количеством операндов мы имеем дело и какого они типа. Обычно работа ведется с операндами того же типа, что и класс, в котором определяется данный оператор, хотя возможна работа со смешанными типами, с чем мы познакомимся позже.

В качестве примера давайте рассмотрим простой класс с именем AddСlass1, определенный следующим образом:




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


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


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



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




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