Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Этап 1: определение типа, который будет хранить всю дополнительную информацию, передаваемую получателям уведомления о событии




При возникновении события объекту, в котором оно возникло, нужно передать дополнительную информацию объектам-получателям уведомления о событии. Для

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

classClickEventArgs : System.EventArgs {

private readonly int_x, _y;

publicClickEventArgs(intx, inty)

{_x = x; _y = y;}

public intX { get{return_x;} }

public intY { get{return_y;} }

}

Этап 2: определение члена-события

В С# член-событие объявляется ключевым словом event. Каждому члену-событию

определяется область действия (практически всегда он открытый, поэтому доступен из любого кода), тип делегата, указывающий на прототип вызываемого метода (или методов), и имя (любой допустимый идентификатор).

classButton {

...

public eventEventHandler<ClickEventArgs> Click;

...

}

При этом подписчик должен выглядеть так:

voidSomeMethod(objectsender, ClickEventArgs e)

 

Этап 3: определение метода, ответственного за уведомление зарегистрированных объектов о событии

В соответствии с соглашением в классе должен быть виртуальный защищенный метод, вызываемый из кода класса и его потомков при возникновении события. Этот метод принимает один параметр, объект MailMsgEventArgs, содержащий дополнительные сведения о событии. Реализация по умолчанию этого метода просто проверяет, есть ли объекты, зарегистрировавшиеся для получения уведомления о событии, и при положительном результате проверки уведомляет зарегистрированные методы о возникновении события.

classButton ...

protected virtual voidOnClick(ClickEventArgs e) {}

private voidRaiseClick(ClickEventArgs e) {

OnClick(e);

EventHandler<ClickEventArgs> tmp = Click;

if(tmp != null) {

tmp(this, e);

}

}

 

Этап 4: определение метода, («генерирующего» событие); транслирующего входную информацию в желаемое событие

У класса должен быть метод, принимающий некоторую входную информацию и

преобразующий его в генерацию события.

classButton {

public voidSimulateClick(intx, inty) {

ClickEventArgs e = newClickEventArgs(x, y);

RaiseClick(e);

}

}



C#. Наследование: правила, синтаксис. Сокрытие имен.

Наследование — один из трех фундаментальных принципов объектно-ориентиро-

ванного программирования, поскольку именно благодаря ему возможно созда-

ние иерархических классификаций. Используя наследование, можно создать общий

класс, который определяет характеристики, присущие множеству связанных элемен-

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

классами с добавлением в каждый из них своих, уникальных особенностей.

В языке С# класс, который наследуется, называется базовым. Класс, который на-

следует базовый класс, называется производным. Следовательно, производный класс —

это специализированная версия базового класса. В производный класс, наследующий

все переменные, методы, свойства, операторы и индексаторы, определенные в базо-

вом классе, могут быть добавлены уникальные элементы.

 

Основы наследования

С# поддерживает наследование, позволяя в объявление класса встраивать другой

класс. Это реализуется посредством задания базового класса при объявлении произ-

водного. Лучше всего начать с примера. Рассмотрим класс TwoDShape, в котором оп-

ределяются атрибуты "обобщенной" двумерной геометрической фигуры (например,

^квадрата, прямоугольника, треугольника и т.д.).

// Класс двумерных объектов,

class TwoDShape {

public double width;

public double height;

public void showDimO {

Console.WriteLine("Ширина и высота равны " +

width + " и " + height);

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

площадку) для классов, которые описывают специфические типы двумерных объек-

тов. Например, в следующей программе класс TwoDShape используется для выведения

класса Triangle. Обратите внимание на то, как объявляется класс Triangle.

// Простая иерархия классов.

using System;

// Класс двумерных объектов,

class TwoDShape {

public double width;

public double height;

public void showDimO {

Console.WriteLine("Ширина и высота равны " +

width + " и " + height);

// Класс Triangle выводится из класса TwoDShape.

class Triangle : TwoDShape {

public string style; // Тип треугольника.

// Метод возвращает площадь треугольника,

public double area() {

return width * height / 2;

// Отображаем тип треугольника,

public void showStyleO {

Console.WriteLine("Треугольник " + style);

class Shapes {

public s t a t i c void MainO {

Triangle t l = new Triangle();

Triangle t2 = new T r i a n g l e ( ) ;

t l . w i d t h = 4.0;

t l . h e i g h t - 4.0;

t l . s t y l e = "равнобедренный";

t2.width = 8.0;

t2.height ≪ 12.0;

t 2 . s t y l e = "прямоугольный";

Console.WriteLine("Информация о t l : " ) ;

tl.showStyle();

tl.showDim();

Console.WriteLine ("Площадь равна " + tl.areaO);

Console.WriteLine();

Console.WriteLine("Информация о t2: " ) ;

t2. showStyleO ;

t2.showDim();

Console.WriteLine("Площадь равна " + t2.area());

Вот результаты работы этой программы.

Информация о tl:

Треугольник равнобедренный

Ширина и высота равны 4 и 4

Площадь равна 8

Информация о t2:

Треугольник прямоугольный

Ширина и высота равны 8 и 12

Площадь равна 4 8

В классе Triangle создается специфический тип объекта класса TwoDShape, в

данном случае треугольник. Класс Triangle содержит все элементы класса

TwoDShape и, кроме того, поле s t y l e , метод area О и метод showStyleO. В пере-

менной s t y l e хранится описание типа треугольника, метод area () вычисляет и воз-

вращает его площадь, а метод showstyle () отображает данные о типе треугольника.

Ниже приведен синтаксис, который используется в объявлении класса Triangle,

чтобы сделать его производным от класса TwoDShape.

class Triangle : TwoDShape {

Этот синтаксис можно обобщить. Если один класс наследует другой, то имя базо-

вого класса указывается после имени производного, причем имена классов разделяют-

ся двоеточием. В С# синтаксис наследования класса очень прост для запоминания и

использования.

Поскольку класс Triangle включает все члены базового класса, TwoDShape, он

может обращаться к членам width и height внутри метода агеа(). Кроме того,

внутри метода MainO объекты t l и t2 могут прямо ссылаться на члены width и

height, как если бы они были частью класса Triangle. Включение класса

TwoDShape в класс Triangle схематически показано на рис. 11.1.

 

TwoDShape

width

height

showDim()

style

area

showStyle()

Triangle

Рис. 11.1. Схематическое представление класса Triangle

 

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

В С# (в отличие от C++) не поддерживается наследование нескольких базовых клас-

сов в одном производном классе. Этот факт необходимо учитывать при переводе

С++-кода на С#. Однако можно создать иерархию наследования, в которой один

производный класс становится базовым для другого производного класса. И конечно

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

Основное достоинство наследования состоит в том, что, создав базовый класс, ко-

торый определяет общие атрибуты для множества объектов, его можно использовать

для создания любого числа более специализированных производных классов. В каж-

дом производном классе можно затем точно "настроить" собственную классифика-

цию.










Последнее изменение этой страницы: 2018-05-27; просмотров: 164.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...