Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1447 / 158 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 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. Ввожу код на сайте, пишет:

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

 

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