Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 75

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 69 70 71 72 73 74 < 75 > 76 77 78 79 80 81 .. 320 >> Следующая

// Улучшенная систена поощрений!
Manager списку - new Manager("Chucky", 92. 100000. "333-23-2322". 9000); chucky.GiveBonusOOO): списку.D іsplayStats О:
Salesperson fran = new SalesPersonCFran". 93, 3000. "932-32-3232". 31):
fran.GiveBonus(2Q0):
fran.DispiayStatsO;
Результат раздачи поощрений представлен на рис.
1 ' D:\CSliarpBuok\Labs\Chapter3\Етр1оург$\Ып^>е -In
Kteftt: fnjKr, чмі"ї; at її 1; : E
Name: Chucky Pay: ІИ038И ID: 92 SEN: 333-23 2322 NiinJier of stock opt ions: 9'mfi
Nrtnn : Fran Pay: 32010 ID: 93 ISSN: 932-32-3232 N'linhei' of sales: 31 Press any key to continue
Ml I ± U
Рис. 3.13. Благодаря полиморфизму мы смогли реализовать более удобную систему поощрений
Мы с вами научились использовать полиморфизм для переопределения поведения производных классов. Однако, как, наверное, вы догадываетесь, возможности полиморфизма этим далеко не исчерпываются.
Поддержка полиморфизма в С# 171
Принудительный полиморфизм: абстрактные методы
После того как мы объявили класс абстрактным, можно определить в нем
количество абстрактных методов. Абстрактные методы - это аналоги чистых виртуальных функций С++: они позволяют определить в базовом классе методы без реализации по умолчанию. Все виртуальные методы обязательно должны быть замещены в производных классах.
Object
void Draw()
Shape
Hexagon
Draw(
H Circle
Draw()
Ю
O
Рис. 3.14. Иерархия классов геометрических фигур
Скорее всего, вы спросите: зачем это нужно?» Для ответа на этот вопрос мы вернемся к иерархии геометрических фигур, с которой мы уже имели дело в этой главе (рис. 3.14).
Абстрактные классы
В настоящее время базовый класс Employee выполняет в нашей программе понятные и логичные функции: он обеспечивает производные классы набором защищенных переменных, а также предоставляет реализации по умолчанию двух виртуальных методов— GiveBonusO и Di spl ayStats (), замещенных в производных классах. Однако в нашей программе до сих пор существует потенциальный источник ошибок: мы можем создавать объекты базового класса Employee:
// А это кто такой? Employee X = new EmployeeO;
«Просто сотрудников» у нас быть не должно — каждой из возможных категорий сотрудников у нас соответствует производный класс. Поэтому вполне логичным будет просто запретить создание объектов класса Employee. В С# для этого
достаточно объявить класс абстрактным:
// Обьязляем класс Employee абетракті*». запрещая создание объектов этого класса abstract public class Employee
{
// Открытые интерфейсы и внутренние сйн.-ые класса
}
Теперь при попытке создания объекта класса Employee компилятор будет выдавать сообщение об ошибке:
// Ошибка! Нельзя создавать экземпляры абстрактного класса Employee X = new Ernpl оуее();
172 Глава 3 * С# и объектно-ориентированное программирование
Как и в случае с классом ;тр1оуеэ, желательно явным образом запретить создание объектов класса Shaре. Это можно сделать следующим образом:
narespace Shapes {
public abstract class Shape {
// Пусть каждый объект-геометрическая фигура получит у нас дружеское прозвище: protected string petName:
Il Конструкторы
public Shaped {petName = "NoName";} public Snapetstring s) {petName = s;}
// Метод . сбъявлен как виртуальный и (тег быть згиеяен
public virtual void DrawO
{
Console.Wri teLine("Shape.Oraw()"):
}
public string PetName {
get {return petName:} set {petName = value;)
}
}/ В классе Circle метод DrawC) HE ЗАМЕЩЕН
public class Circle : Shape
{
public CircleO {}
public Circle(string name): base(name) {}
}
// IS Hexagon метод DrawO ЗАМЕЩЕН
public class Hexagon : Shape
{
public HexagonO {}
public Hexagon (string name) : base(name) {}
public overrride void DrawO
{
Console.WriteLine("Drawing {0} the Hexagon", PetName);
}
}
}
Обратите внимание, что в классе Shape определен виртуальный метод DrawO. Как мы видим, виртуальные методы можно замещать в производных классах при помощи ключевого слова override (как это сделано в определении класса Hexagon). Однако в С# виртуальные методы можно и не замещать в производных классах (например, в определении класса Ci Iе виртуальный метод Draw( j базового класса остался незамещенным). При этом в случае вызова метода Draw() для объекта класса Hexagon будет вызван уникальный вариант этого метода для класса Hexagon, а если мы вызовем тот же метод для объекта класса Circle, этот метод будет выполнен в соответствии со своим определением в базовом классе:
// В объекте Circle реализация базового класса для DrawO не замещена
public static int Main(string[] args)
{
Il Создаем и рисуем шестиугольник
Поддержка полиморфизма в 173
Hexagon hex = new HexagonC'Beth"): hex. DrawO;
Circle cir - new CircleCCindy"):
Il H-mm! Придется использовать реализацию DrawO базового класса cir.DrawO;
Г
Результат работы этой программы представлен на рис. 3.15.
О: ,LShdrpBi>ak\Ldbs.Chapter 3\Shdpes... HE EI
Xi\-(\ и in ¦ і ! !¦ ¦ t. h the Mn * d ¦ і ¦ »Lt Bl
:!^ Ihi ¦ j и: - 1)i*ai-j<>
Предыдущая << 1 .. 69 70 71 72 73 74 < 75 > 76 77 78 79 80 81 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100