|
Программирование >> Программирование с использованием ajax
public Card this[int cardlndex] { get { return (Card)List[cardlndex]; set { List[cardlndex] = value; Вспомогательный метод для копировгшия экземпляров Card в другой экземпляр Cards - используемый в Deck. Shuffle () . В данной реализахц1и предполагается, что исходная коллекция и целевая коллекция имеют одинаковый размер. public void СоруТо (Cards targetCards) for (int index = 0; index < this.Count; index++) { targetCards[index] = this[index]; не в стандартном формате практического занятия. При желании можете открыть версию данного проекта, входящую в состав загружаемого кода для этой главы. Не забудьте, что при копировании исходных файлов из ChlOCardLib в ChllCardLib нужно обязательно изменить объявления пространств имен так, чтобы они ссылались на ChllCardLib. То же самое касается и консольного приложения Chi OCardClient, которое вы будете использовать для тестирования. В состав загружаемого кода входит проект, содержащий весь код, который может потребоваться для обеспечения различных расширенных возможностей в ChllCardLib. Этот код поделен на разделы, в каждом из которых можно удалять комментарии при желании испробовать его в действии. Если же вы хотите создать данный проект самостоятельно, добавьте в него новый класс Cards и измените код в представляющем его файле Cards. cs следующим образом: using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; namespace ChllCardLib public class Cards : CollectionBase public void Add (Card newCard) List.Add(newCard); public void Remove (Card oldCard) List.Remove(oldCard); public Cards 0 Выполнение проверки для выяснения, содержится зт ъ коллекхц1и Cards определенная карта. Эта проверка подразумевает вызов для коллекхц1и метода Contains коллекции ArrayList, доступ к которому получается через свойство InnerList. public bool Contains(Card card) return InnerList.Contains(card); Теперь измените код в файле Deck.сs так, чтобы в нем использовалась эта новая коллекция, а не массив: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ChllCardLib public class Deck { private Cards cards = new Cards () ; public DeckO { Здесь была удалена строка кода 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]; else tlirow (new System.ArgumentOutOfRangeException ( cardNum , cardNum, Value must be between 0 and 51. )); public void SliuffleO { Cards newDeck = new Cards () ; bool[] assigned = new bool[52]; Random sourceGen = new Random(); for (int i = 0; i < 52; i++) { int sourceCard = 0; bool foundCard = false; wliile (foundCard == false) { sourceCard = sourceGen.Next(52); if (assigned[sourceCard] = false) foundCard = true; assigned[sourceCard] = true; Глава И. Коллекции, сравнения и преобразования 303 newDeck.Add(cards[sourceCard]); newDeck.CopyTo(cards); Здесь требуется не очень много изменений. Большая часть из них состоит в изменении логики тасования так, чтобы она предусматривала факт добавления карты в начало новой Cards-коллекции newDeck из позиции со случайным индексом в cards, а не в позицию со случайным индексом в newDeck из последовательной позиции в cards. Клиентское консольное приложение СЫOCardClient, создававшееся для решения ChlOCardLib, может применяться с этой новой библиотекой с тем же результатом, поскольку сигнатуры методов Deck не изменились. Клиенты этой библиотеки классов теперь, однако, смогут использовать класс коллекции Cards, а не полагаться на массивы объектов Card, например, в случае определения имеющихся на руках карт в приложении для игры в карты. Ключевые коллекции и интерфейс iDictionary Вместо интерфейса IList также допускается, чтобы коллекции реализовали похожий интерфейс IDictionary, который позволяет, чтобы элементы индексировались с помощью ключевого значения (например, строкового имени), а не индекса. Подобное поведение также достигается с помощью индексатора, хотя в таком случае в качестве параметра для индексатора указывается ключ, ассоциируемый с хранимым элементом, а не индекс int, что может делать коллекцию гораздо более дружественной к пользователю. Как и в случае индексированных коллекций, существует базовый класс, который можно использовать для упрощения интерфейса IDictionary - DictionaryBase. Этот класс тоже поддерживает интерфейсы lEnumerable и ICollection и предлагает базовые возможности для манипулирования, которые одинаковы для любой коллекции. Класс DictionaryBase подобно CollectionBase реализует некоторые (не все) из тех членов, которые получает от поддерживаемых им интерфейсов. В частности, как и класс CollectionBase, он реализует члены Clear и Count, но не член RemoveAt (), поскольку тот является методом интерфейса IList и не присутствует в интерфейсе IDictionary. Но зато у интерфейса IDictionary есть метод Remove (), и этот метод является одним из тех, которые следует реализовать в классе специальной коллекции на базе DictionaryBase. В следующем коде демонстрируется альтернативная версия класса Animals, на этот раз унаследованная от DictionaryBase и включающая реализации методов Add () и Remove (), а также индексатора с доступом по ключу: public class Animals : DictionaryBase { public void Add(string newID, Animal newAnimal) Dictionary.Add(newID, newAnimal); public void Remove(string animallD) Dictionary.Remove(animallD); public Animals()
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |