|
Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет: Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.
Как активировать код? |
Создание оконных приложений Windows Forms
Перегрузка наследуемых обработчиков пользовательского класса
Наследование является центральным механизмом объектно-ориентированного программирования. Оно позволяет присоединить код уже разработанного класса к новому и уточнить его. Производный ( Derived ) класс наследует все данные и методы базового ( Base ) класса. В коде производного класса остаются доступными те данные и методы, которые в базовом классе объявлены общедоступными ( public ) или защищенными ( protected ). А если эти методы объявлены в базовом классе как виртуальные (с ключевым словом virtual ), то их можно перегружать (используя ключевое слово override ) в производном классе, сохраняя при этом прежнюю доступность, имя и сигнатуру.
Определим в коде нашего примера производный класс, который будет наследовать базовый класс и переопределять обработчики подписанных событий. Для этого объявим в базовом классе обработчики общедоступными и виртуальными. Измененный код будет таким
using System;
using System.Windows.Forms;
using System.Drawing;
namespace MyApp
{
// Наследует библиотечному классу
class MyForm : Form
{
// Конструктор с настройками
public MyForm()
{
// Начальная настройка окна
this.Text = "Подписка событий";
this.BackColor = SystemColors.Window;
this.StartPosition = FormStartPosition.CenterScreen;
// Подписка на события окна
this.Paint += new PaintEventHandler(MyPaint);
this.Click += new EventHandler(MyClick);
// Альтернативный синтаксис подписки
this.Resize += MyResize;
}
// Объявили и инициализировали внутреннее поле
Random rnd = new Random();
public virtual void MyPaint(object sender, PaintEventArgs e)
{
MessageBox.Show("Окно разрушено!",
"Класс MyForm");
Graphics gr = e.Graphics;// Ссылка на контекст экрана
// Рисуем разрушенную часть
// клиентской области случайным цветом
gr.Clear(Color.FromArgb(rnd.Next(255), // Red
rnd.Next(255), // Green
rnd.Next(255))); // Blue
}
// Обработчик события создан,
// но класс на него не подписался
public virtual void MyClick(object sender, EventArgs e)
{
MessageBox.Show("Выполнен одиночный щелчок!",
"Класс MyForm");
}
public virtual void MyResize(object sender, EventArgs e)
{
MessageBox.Show("Размеры окна изменены!",
"Класс MyForm");
}
}
// Наследует пользовательскому (нашему) классу
class MyDerivedForm : MyForm
{
public override void MyPaint(object sender, PaintEventArgs e)
{
MessageBox.Show("Окно разрушено!",
"Класс MyDerivedForm");
// Захотели вызвать метод базового класса
base.MyPaint(sender, e);
}
public override void MyClick(object sender, EventArgs e)
{
MessageBox.Show("Выполнен одиночный щелчок!",
"Класс MyDerivedForm");
}
public override void MyResize(object sender, EventArgs e)
{
MessageBox.Show("Размеры окна изменены!",
"Класс MyDerivedForm");
}
}
}
Листинг
6.9 .
Код файла MyForm.cs
using System.Windows.Forms;
// Лишние пространства имен удалили
namespace MyApp
{
class EntryPoint
{
public static void Main()
{
Application.Run(new MyDerivedForm());
}
}
}
Листинг
6.10 .
Код файла Program.cs
-
Установите в свойствах проекта точку входа по умолчанию ( Not set ) и запустите приложение
В производном классе мы не подписывались на события - подписка унаследована из базового класса. Мы лишь перегрузили унаследованные обработчики на новые. Старые обработчики можно вызвать из базового класса, адресуясь с помощью ключевого слова base.