Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 6:

Создание оконных приложений 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.

Максим Филатов
Максим Филатов

Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет:

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

 

Как активировать код?

Денис Пашков
Денис Пашков
Россия
Татьяна Ковалюк
Татьяна Ковалюк
Украина, Киев, Киевский политехнический институт, 1974