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

1 ... 126 127 128 [ 129 ] 130 131 132 ... 396


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 () содержащего класса, не наблюдается.

Выведение типов

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

тип имя переменной;



1 ... 126 127 128 [ 129 ] 130 131 132 ... 396

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