Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
45666666666666666666666666666666666666666666666....rtf
Скачиваний:
1
Добавлен:
10.07.2019
Размер:
224.9 Кб
Скачать

Void MyButtonClickEventHandler( object sender, EventArgs e )

{

mrButton.Text = "You clicked me!";

}

}

С компьютерного на наш язык это можно перевести следующим образом:

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

Итак, при нажатии на кнопку, приведенная выше строка кода направляет программу к методу обработчика событий. При его выполнении надпись на кнопке меняется на «You clicked me!»

Чтобы попробовать этот код, остановите свою программу, добавьте в нее выделенный жирным код (в соответствующее место) и нажмите клавишу F5 для выполнения программы. Нажмите на кнопку и ее надпись изменится. Рабочую программу — пример события нажатия на кнопку можно найти в папке примеров к этой книге (Программа 5).

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

public void TheMouseIsDown( object sender, MouseEventArgs e )

{

if ( e.Button == MouseButtons.Left )

{

this.Text = "Нажата левая кнопка мыши";

}

}

А далее показано как событие можно связать с методом. В этом примере говорится: «Если при выполнении этой программы нажимается кнопка мыши, перейти к методу TheMouseIsDown», которому известно как обрабатывать события мыши:

this.MouseDown += new MouseEventHandler( TheMouseIsDown );

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

public void TheMouseWasClicked(object sender, MouseEventArgs e)

{

// При нажатии левой кнопки

if (e.Button == MouseButtons.Left)

{

// Расширение текущего окна

this.Width = this.Width + 100;

}

else if (e.Button == MouseButtons.Right)

{

// Сужение текущего окна

this.Width = this.Width - 100;

}

}

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

public void TheMouseMoved(object sender, MouseEventArgs e)

{

// Подготовка области рисования

System.Drawing.Graphics g = this.CreateGraphics();

// Использование красной ручки

System.Drawing.Pen redPen = new System.Drawing.Pen(Color.Red, 3);

// Рисуем окружность (эллипс, точки которого равноудалены от центра)

// Левый верхний угол квадрата имеет координаты X и Y текущего положения мыши

g.DrawEllipse(redPen, e.X, e.Y, 40, 40);

// Очистка

g.Dispose();

}

На следующем снимке экрана показано как это выглядит при перемещении мыши:

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

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

Очевидно, если мы напишем:

Улица им. Ленина, 17

Улица им. Ленина, 82

то не будет разницы между этими улицами и почтальон будет ужасно разочарован.

Вместо этого можно было бы написать так:

Улица им. Ленина, 17. г. Москва

Улица им. Ленина, 82. г. Алматы.

Так-то лучше, но что если будет два города с названием Москва! Тогда лучше всего добавить еще и название страны.

Улица им. Ленина, 17. г. Москва. Российская Федерация.

Улица им. Ленина, 82. г. Алматы. Республика Казахстан.

Адрес с таким же успехом можно написать и наоборот:

Российская Федерация. г. Москва. Улица им. Ленина, 17.

Республика Казахстан. г. Алматы. Улица им. Ленина, 82

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

Формат [Республика Казахстан.Алматы.ул. им. Ленина] можно считать «пространством имен» для отправки писем.

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

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

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

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

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

Microsoft.Drawing.Point

Susy.PictureStuff.Point

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

Susy.PictureStuff.Point SusyPoint = new Susy.PictureStuff.Point();

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

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

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

Присвоение пространства имен собственному классу

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

class Animal

{

...

}

включите его в следующий код:

namespace Susy

{

class Animal

{

...

}

}

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

namespace Susy.FunStuff

{

class Animal

{

...

}

}

Можно создать любое пространство имен, которое, как вам кажется, имеет смысл. Просто разделяйте свои слова точкой (.).

В последнем приведенном примере, класс Animal теперь входит в пространство имен Susy.FunStuff.

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

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

Или, если бы нам нужно было использовать много объектов из одного пространства имен, и при этом не хотелось бы каждый раз писать «Charles.SchoolUtilities», то мы могли бы употребить ключевое слово «using» в начале программы, чтобы сообщить компьютеру, что в дальнейшем будем применять это пространство имен. Например:

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

using Charles.SchoolUtilities;

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

Animal cat = new Animal();

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

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

namespace Charles.SchoolUtilities

{

class Animal

{

}

}

Charles.SchoolUtilities.Animal

cat = new Charles.SchoolUtilities.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;

}

class Bird : Animal // Класс «Bird» наследует от класса «Animal»

{

public string featherColor;

}

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

Итак, когда мы пишем

class Bird : Animal

{

...

}

мы фактически говорим: «Я определяю новый класс “Bird”, но он должен автоматически наследовать все свойства класса «Animal». Часто говорят, что класс «Bird» является производным от класса «Animal».

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

Bird b = new Bird();

b.kindOfAnimal = “Tawny Eagle”;

b.isMammal = false;

b.featherColor = “Tawny”;

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

Другой пример — Наследование некоторых возможностей работы с окнами в вашей программе.

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

Итак, когда мы пишем

class MyFancyClass : Form

{

...

}

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

Рассматриваемые в этой главе вопросы разбираются на практике в Главе III по System.Windows.Forms.

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

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

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

Класс можно заставить наследовать признаки и способности другого класса.

В следующем примере класс «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”;