Пространства имен и почтовая служба в С#

В мире существуют сотни, а может быть, и тысячи, улиц, названных именем А.С. Пушкина. Но если на конверте указана одна из них, то как письмо находит своего получателя? Естественно, адрес состоит не только из улицы. Мы, по меньшей мере, добавляем название страны и города.

Очевидно, если мы укажем адрес на конверте:

улица Пушкина, 17; улица Пушкина, 82,

то почта не распознает, где эта улица и где этот дом.

Можно написать так:

улица Пушкина, 17, г. Москва; улица Пушкина, 82, г. Алма-Ата

Так-то лучше, а если существуют два города с одинаковым названием? Например, город Москва есть в США! Поэтому для надежности добавим еще и название страны: улица Пушкина, 17, г. Москва, Российская Федерация; улица Пушкина, 82, г. Алма-Ата, Республика Казахстан.

В России адрес принято писать так:

Российская Федерация, г. Москва, улица Пушкина, 17;

Республика Казахстан, г. Алма-Ата, улица Пушкина, 82.

Теперь письмо обязательно дойдет до адресата. Например, второе письмо доставят самолетом в Республику Казахстан, из аэропорта его перевезут на почтамт города Алма-Аты, а потом почтальон пойдет на улицу Пушкина и найдет дом под номером 82.

Формат (Республика Казахстан, г. Алма-Ата, ул. Пушкина) можно считать «пространством имен» для отправки писем.

Пространства имен и программный код

Какое же отношение все это имеет к программированию?

Предположим, разработчиками корпорации Microsoft написан класс «Point», используемый для рисования фигуры в определенной точке, но и вы создали класс с именем «Point», например, для загрузки фотографии человека, указывающего на что-либо.

//Примечание редактора. Слово Point в английском языке многозначное и означает как «точку», так и глагол «указывать».

Очевидно, что оба класса выполняют абсолютно разные действия, но и тот и другой можно назвать Point. С каким же из них будет работать программа?

Безусловно, имеет смысл использовать разные имена. В среде .NET для этого можно задействовать различные «пространства имен». Например, так:

Microsoft.Drawing.Point

Anna.PictureStuff.Point

Имена классов сохранены (Point), но пространства имен перед именами класса позволяют четко видеть, в каком из них находится класс. И теперь, если мне нужно использовать класс Point из пространства Anna, я могу создать объект Point при помощи следующего метода-конструктора:

Anna.PictureStuff.Point annaPoint = new Anna.PictureStuff.Point();

Для работы с классом Point от Microsoft подойдет следующий код:

Microsoft.Drawing.Point microsoftPoint = new Microsoft.Drawing.Point();

Несмотря на то что оба моих объекта принадлежат классу Point, они относятся к разным классам и выполняют разные действия.

Как создать пространство имен и поместить в него собственный класс

Разместить собственный класс в пространстве имен очень просто. Раньше мы давали описание класса следующим образом:

class Animal

{ …

}

Теперь создайте пространство имен и внутри него опишите класс:

namespace Anna

{ class Animal

{ …

}

}

Или, если хотите, сделайте так:

namespace Anna.FunStuff

{ class Animal

{ …

}

}

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

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

Строительный блок: Пространство имен

Для логического объединения классов одной тематики рекомендуется помещать их в одно пространство имен. Имя пространства должно иметь содержательный смысл.

Экземпляр или объект приведенного выше класса можно создавать, вызывая конструктор класса.

Если нужно создать много объектов одного пространства имен, то в начале программы в предложении «using» можно указать пространство имен. Тогда компьютер сам будет находить классы в этом пространстве.

namespace Charles.SchoolUtilities

{ class Animal

{

}

}

Charles.SchoolUtilities.Animal cat; cat = new Charles.SchoolUtilities.Animal();

// говорим компьютеру, что будем использовать

//классы из этого пространства имен using Charles.SchoolUtilities;

// создание объекта Animal из пространства

//имен Charles.SchoolUtilities

Animal cat = new Animal();

Наследование

Так как эта книга адресована тем, кто только начинает знакомиться с искусством программирования, мы не станем рассматривать слишком сложные вещи, поэтому расскажем о наследовании немного.

Иногда вам будет встречаться объявление классов следующего вида:

class MyFancyClass : Form

{ …

}

Сравните его с обычным объявлением класса:

class MyFancyClass

{ …

}

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

Наследование среди людей

Человек, как правило, наследует определенные качества от своих родителей. У вас может быть цвет волос как у мамы, а нос — папин.

Это не означает, что вы полностью похожи на своих родителей. Несомненно, вы обладаете различными уникальными качествами и способностями, но определенные свойства характера и физические особенности «заложены» в вас при рождении.

Наследование кода

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

Приведем пример. Определим два класса — Animal и Bird. Класс Bird объявим наследником класса Animal.

class Animal

{

//Поля класса public string kindOfAnimal; public string name; public int numberOfLegs; public int height; public int length; public string color; bool hasTail; protected bool isMammal; private bool spellingCorrect;

}

// Класс “Bird” — наследник класса “Animal” class Bird : Animal

{ public string featherColor;

}

В реальном мире птица — это вид животного, но у птиц есть свои отличительные признаки, характерные только для них. Тогда имеет смысл классу Bird наследовать все признаки класса Animal и стать обладателем ряда дополнительных признаков. В данном случае мы определим одно специальное поле, характерное для птиц, — featherColor — цвет перьев.

Итак, пишем:

class Bird : Animal

{ …

}

Таким образом мы сообщаем следующее: «Я определяю новый класс Bird, но он должен автоматически наследовать все свойства класса Animal». Иными словами, класс Bird является производным от класса Animal.

При создании экземпляра Bird мы можем обращаться как к полям, определенным в классе Bird, так и к наследуемым полям класса Animal, конечно, если эти поля не являются закрытыми:

Bird b = new Bird();

b.kindOfAnimal = “Орел”;

b.isMammal = false;

b.featherColor = “темно-желтый”;

//Примечание редактора. Это фрагмент кода, о корректности которого нельзя судить без знания контекста. Доступ к свойствам зависит от того, где появляется приведенный выше текст: если из метода класса Bird, то доступ к защищенному (protected) свойству isMammal разрешен, поскольку класс Bird — потомок класса Animal; если же из метода класса клиента, то это свойство будет недоступно.

Более важное замечание: о наследовании можно говорить, только когда объекты двух классов связаны отношением «является». Каждая птица (объект класса Bird) является животным (объектом класса Animal). Поэтому класс Bird может быть объявлен наследником класса Animal, но класс Car, автомобили, нельзя объявлять наследником класса Animal, поскольку автомобили не являются животными.

Для простоты мы не включили в программу объявление методов в классах Animal и Bird, но для них действуют те же правила доступа, что и для полей. Производный класс может вызывать любые методы в родительском классе, если они не объявлены закрытыми.

Наследование возможностей работы с окнами

Предположим, вам нужно написать программу, выполняемую в обычном окне, и понадобятся возможности изменения размера окна, его разворачивания, сворачивания, перетаскивания и некоторые другие. Имеет смысл, чтобы ваш класс «наследовал» возможности класса, который уже работает с подобным типом интерфейса. Обычным выбором родительского класса становится класс System.Windows.Forms.Form.

В таком случае пишем:

class MyFancyClass : Form

{ …

}

Фактически мы говорим: «Я создаю собственный класс, но он должен автоматически наследовать все возможности класса Form».

Когда следует использовать наследование

Для использования класса совсем не обязательно наследовать от него поля! Наследование лучше всего подходит для тех случаев, когда то, чего вы пытаетесь добиться, можно получить от существующего класса, дополнительно расширив его или настроив.

Строительный блок: Наследование

Класс может наследовать свойства и действия другого класса.

Класс «Guitarist» наследует все поля из класса «», а кроме того, имеет два собственных поля.

Имя класса Musician, написанное после двоеточия, сообщает компьютеру, что новый класс «Guitarist» наследует поля и методы родительского класса «Musician».

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

public class Musician

{ public string name; public int age; public bool canSing;

}

public class Guitarist : Musician

{ public string guitarType; public string guitarBrand;

}

Guitarist g = new Guitarist();

g.name = «Jimbo van Helsdingen»;

g.ageInYears = 28;

g.canSing = false;

g.guitarType = «Acoustic»;

g.guitarBrand = «Gibson»;

О Main Aditor

Здравствуйте! Если у Вас возникнут вопросы, напишите нам на почту help@allinweb.ru

Добавить комментарий

Ваш адрес email не будет опубликован.