|
Программирование >> Программирование с использованием ajax
List<Curry> curries = new List<Curry>() ; curries.Add(new Curry( Chicken , Pathia , 6) ) ; curries.Add(new Curry( Vegetable , Korma , 3) ) ; curries.Add(new Curry( Prawn , Vindaloo , 9)) ; можно использовать следующий код: List<Curry> moreCurries = new List<Curry> { new Curry {Mainlngredient = Chicken , Style = Pathia , Spiciness = 6}, new Curry {Mainlngredient = Vegetable , Style = Korma , Spiciness =3}, new Curry {Mainlngredient = Prawn , Style = Vindaloo , Spiciness = 9} Такой подход прекрасно подходит для тех типов, которые в основном используются для представления данных, и потому делает инициализаторы коллекций замечательным дополнением к технологии LINQ, которая будет описываться позже в книге. Практическое замятиГ Инициализаторы 1. Создайте новое консольное приложение по имени Chl4Ex01 и сохраните его в каталоге С: \BegVCSharp\Chapterl4. 2. Щелкните правой кнопкой мыши на имени этого проекта в окне Solution Explorer и выберите в контекстном меню, которое появится после этого, пункт Add=>Add Existing Item (ДобавитьДобавить существующий элемент). 3. Выберите файлы Animal.cs, Cow.cs, Chicken.cs, SuperCow.cs и Farm.cs из каталога С; \BegVCSharp\Chapterl2\Chl2Ex04\Chl2Ex04 и щелкните на кнопке Add (Добавить). 4. Измените объявление пространства имен в каждом из добавленных файлов следующим образом: namespace Chl4Ex01 5. Добавьте в классы Cow, Chicken и SuperCow конструктор по умолчанию. Например, в случае класса Cow добавьте следующий код: namespace Chl4Ex01 { public class Cow : Animal { public Cow() 6. Измените код в файле Program, cs, как показано ниже: static void Main(string[] args) { Farm<Animal> farm = new Farm<Animal> { new Cow { Name= Norris }, new Chicken { Name= Rita }, new Chicken 0 , new SuperCow { Name= Chesney } farm.MakeNoises(); Console.ReadKey(); 7. Выполните сборку приложения. На рис. 14.1 показаны ошибки, которые должны появиться в результате этого процесса сборки. Dcsaipbon Flic lint Ol Chl4Ex01.Firm<Chl4ExOl>nlmil> doei notcontiin i defintUonfor Add Prognm cj 14 О 2 Chl4ExtlLFirm< chl4Cxt)l>nimil doei not contiin a definition for Add Prognm о 15 Q 1 Chl4fxOI.Farm<Chl4fx01Anlmal> doc5 not contiin definition for Add Prognm C5 16 Chl4Ex01.Firm<Chl4Ex01Anlmi* doej not contain adefiniton for Add Program 17 Project Chl4Ex0l Chl4Ex01 Chl4Ex01 Chl4Ex01 Error Lut >Vi>putШЙЯЯ] Рис. 14.1. Ошибки при попытке сборки приложения 8. Добавьте в файл Farm.сs следующий код: namespace Chl4Ex01 { public class Farm<T> : IEnumerable<T> where T : Animal public void Add(T animal) animals. Add (animal) ; 9. Запустите приложение. На рис. 14.2 показан результат, который должен получиться. Рис. 14.2. Приложение Chi 4Ех01 в действии Описание полученных результатов Этот пример иллюстрирует применение инициализаторов объектов и коллекций для создания и заполнения коллекции объектов за один шаг. В роли коллекции выступает уже демонстрировавшаяся в предыдущих главах коллекция объектов, представляющих животных с фермы, для применения инициализаторов с которыми требуется внести два изменения. Во-первых, ко всем классам, унаследованным от базового класса Animal, добавляются конструкторы по умолчанию. Это необходимо потому, что, как показывалось ранее в этой главе, при использовании инициализаторов объектов вызываются конструкторы по умолчанию. В результате применения этих конструкторов по умолчанию свойство Name инициализируется в соответствии с конструктором по умолчанию базового класса, код которого выглядит так: public Animal О { паше = The animal with no name ; Однако при использовании инициализатора объекта с классом, унаследованным от Animal, важно помнить о том, что любые свойства, за установку которых отвечает инициализатор, устанавливаются после создания экземпляра объекта и, следовательно, после выполнения конструктора базового класса. Это означает, что в случае предоставления значения для свойства Name в виде части инициализатора объекта, оно будет перекрывать значение, устанавливаемое для него по умолчанию. В рассматриваемом примере значение для свойства Name устанавливается для всех, кроме одного из добавляемых в коллекцию элементов. Во-вторых, в класс Farm добавляется метод Add (). Делается это в ответ на ряд выданных компилятором ошибок следующего вида: Chl4Ex01.Farm <Chl4Ex01.Animal> does not contain a definition for Add Chl4Ex01. Farm <Chl4Ex01 .Animal> не содержит определения для Add Это ошибка отражает часть базовой функциональности инициализаторов коллекций. За кулисами компилятор вызывает метод Add () коллекции для каждого элемента, который предоставляется в инициализаторе коллекции. Класс Farm предоставляет доступ к коллекции объектов через свойство по имени Animals. Компилятор не может догадаться, что это и есть то самое свойство, которое нужно заполнить (методом Animals .Add ()), и потому выдает сообщение об ошибке. Для устранения данной проблемы в класс Farm и добавляется метод Add(), который инициализируется с помощью инициализатора объектов. В качестве альтернативы можно было бы изменить код в примере и путем предоставления вложенного инициализатора для свойства Animals, как показано ниже: static void Main(string[] args) { Farm<Animal> farm = new Farm<Animal> { Animals = { new Cow ( Name= Norris }, new Chicken { Name= Rita }, new Chicken (), new SuperCow { Name= Chesney } farm.MakeNoises(); Console.ReadKey 0; В случае использования такого кода предоставлять метод Add () для класса Farm уже бы не потребовалось. Этот альтернативный вариант больше подходит для таких ситуаций, когда имеется класс, содержащий несколько коллекций. В данном случае никакого очевидного кандидата на роль коллекции, подлежащей добавлению с помощью метода Add () содержащего класса, не наблюдается. Выведение типов Ранее в настоящей книге уже упоминалось о том, что С# является строго типизированным языком, т.е. что каждая переменная в нем имеет фиксированный тип и может использоваться только в том коде, в котором это учитывается. Во всех приводившихся до сих пор примерах переменные объявлялись с помощью либо такого синтаксиса: тип имя переменной;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |