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

1 ... 103 104 105 [ 106 ] 107 108 109 ... 396


class ClassD : ClassA

В следующем коде операция аз используется для выполнения преобразования хранящегося в obj 1 экземпляра С1аззА в тип С1азз0:

ClassA objl = new ClassA (); ClassD obj2 = objl as ClassD;

Выполнение этого кода приведет к получению в obj 2 значения null.

Однако с помощью полиморфизма можно сделать так, чтобы экземпляры С1азз0 сохранялись в переменных типа С1аззА. В следующем коде иллюстрируется этот подход, и операция аз используется для преобразования в тип С1азз0 переменной типа С1аззА, содержащей экземпляр типа С1азз0:

ClassD objl = new ClassD ();

ClassA obj2 = objl;

ClassD obj3 = ob]2 as ClassD;

Ha этот раз выполнение кода приведет к тому, что в obj 3 будет содержаться ссылка на тот же самый объект, а не значение null.

Такая функциональность делает операцию аз очень полезной, поскольку следующий код (в котором применяется простая операция приведения типов), например, будет приводить к выдаче исключения:

ClassA objl = new ClassA(); ClassD obj2 = (ClassD)objl;

В случае использования в этом коде операции аз он будет приводить просто к присваиванию obj2 значения null - исключение генерироваться не будет. Поэтому код вроде того, что приведен ниже (и в котором участвуют два разработанных ранее в главе класса, а именно - Animal и производный от него класс Cow), очень часто и применяется в приложениях на С#:

public void MilkCow(Animal myAnimal) {

Cow myCow = myAnimal as Cow;

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

□ Если операнд, указанный в <операнд>, имеет тип, заданный в <тип>.

□ Если операнд, указанный в <операнд>, может быть неявно преобразован в тип, заданный в <тип>.

а Если операнд, указанный в <операнд>, может быть упакован в тип, заданный в

<тип>.

Если операнд, указанный в <операнд>, не может быть приведен к типу, заданному в <тип>, результатом выражения будет null.

Обратите внимание, что выполнять преобразование из базового класса в производный с применением операции явного преобразования можно, но такой подход работает не всегда. Рассмотрим классы С1аззАиС1азз0из приведенного ранее примера, где С1азз0 унаследован от С1аззА:

class ClassA : IMylnterface



if (myCow != null) {

myCow.Milk О;

else {

Console.WriteLine ( {0} isnt a cow, and so cant be milked. , myAnimal.Name);

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

Резюме

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

Каждая из рассмотренных тем имеет много сфер применения. С коллекциями наверняка придется иметь дело в той или иной форме практически в любом приложении, а создание строго типизированных коллекций может существенно облегчить жизнь в ситуациях, когда требуется работать с группой объектов одинакового типа. Еще здесь было рассказано и о том, как добавлять индексаторы и итераторы, которые позволяют легко получать доступ к объектам внутри коллекции.

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

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

Упражнения

1. Создайте класс типа коллекции по имени People, представляющий собой коллекцию показанного ниже класса Person. Элементы в этой коллекции должны быть доступны через строковый индексатор, в роли которого должно выступать имя человека, идентичное хранящемуся в свойстве Person.Name:

public class Person

private string name; private int age; public string Name

get {

return name;



public int Age get

return age; set

age = value;

2. Расширьте класс Person из предыдущего упражнения так, чтобы в нем перегружались операции >,<,>= и <= и выполнялось сравнение свойства Age со свойством Age других экземпляров Person.

3. Добавьте в класс People метод GetOldest, возвращающий массив объектов Person с наибольшим значением в свойстве Age (их может быть как один, так и больше, поскольку многие элементы могут иметь в этом свойстве одинаковое значение) с использованием перегруженных версий операций, которые определили ранее.

4. Реализуйте в классе People интерфейс ICloneable для обеспечения возможности глу(5окого копирования.

5. Добавьте в класс People итератор, позволяющий получать значения Age всех членов в цикле foreach показанным ниже образом:

foreach (int age in myPeople.Ages) {

Отображение значений возраста.

set {

name = value;



1 ... 103 104 105 [ 106 ] 107 108 109 ... 396

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