Прошел курс. Получил код 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.