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

 

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

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

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

// Класс Radio вложен в класс Саг. Все остальное - как в предыдущем приложении
public class Саг : Object
I
// К вложенному закрытому класу Radio нельзя обратиться из внешнего мира
private class Radio
{
public Radio(){}
public void TurnOnCbDol on)
if(on)
Console. WriteLi net "Jamming, .,")¦;
else
Console.WriteLinef, "Quiet time. . ."};
}
}
II Внешний класс монет создавать экземпляры вложенных типов private Radio theMusicBox;
J
168 Глава 3 •Cf и объектно-ориентированное программирование
Поддержка полиморфизма в С#
Предположим, что в базовом классе Employee определен метод GiveBonus () — поощрить:
// В классе Employee определен новый метод для поощрения сотрудников public class Employee
public void GiveBonus (float amount)
{
currPay +- amount:
}
Поскольку этот метод определен в базовом классе как риЫ i вы теперь можете поощрять продавцов и менеджеров: // Поощрения объектам производных классов
Manager chucky-new ManagerC'Chucky". 92. 100O00, "333-23-2322", 9000); списку-G1veBonus(300); списку.DisplayStatsO:
Salesperson fran - new SalesPersonCFran". 93. 3000. "932-32-3232", 31); fran.GiveBonus(200); fran. DisplayStatsO;
Результат выполнения поощрения представлен на рис. 3.12.
D:\C Sh.iri>U(iok l<)bs.llui|iti-i U ,Imiiluyervtwi... ПИИ
Н.«мг : ¦ ¦ І'.іч: IHIIІИИ ID: 92
к:;н: ззз-23-гзаа
N.Oli: : 1'YiIII Г.. у:
ID: 93
BSHt чул г/. тлгг
Vi^' : .чі» у J.°' •f to ¦ ч!, ! M.....
Ж
Рис. 3.12. Полиморфизм не используется; метод действует одинаково в отношении обоих производных классов
Обратите внимание, что класс Саг имеет возможность создавать объекты любых вложенных в него типов. Также необходимо отметить, что вложенный класс объявлен как private. В С# вложенные классы могут объявляться и как private, и как public. Однако классы, которые объявлены в пространстве имен напрямую (то есть те классы, которые не вложены ни в какой другой класс), не могут быть объявлены как pri vate.
Новый вариант приложения Саг работает также, как и предыдущий. Мы также не можем напрямую обратиться из внешнего мира к классу Radio:
// За предепаки класса Саг такая операция приведет только к ошибке! Radio г - new RadioO;
Код приложения Nested можно найти в подкаталоге Chapter 3.
Поддержка полиморфизма в С* 169
Проблема заключается в том, что унаследованный метод пока
работает абсолютно одинаково в отношении объектов обоих производных классов — и объектов Sal esPerson, и объектов Manager. Однако, конечно, было бы лучше, чтобы для объекта каждого класса использовался свой уникальный вариант метода. Например, при поощрении продавцов можно учитывать их объем продаж. Менеджерам помимо денежного поощрения можно выдавать дополнительные опционы на акции. Поэтому задачу можно сформулировать так; «Как заставить один и тот же метод по-разному реагировать на объекты разных классов?»
Для решения этой задачи в С# предусмотрено понятие полиморфизма. Полиморфизм позволяет переопределять реакцию объекта производного класса на метод, определенный в базовом классе. Для реализации полиморфизма в нашем приложении мы воспользуемся ключевыми словами С#: virtual и override. Если базовый класс определяет метод, который должен быть замещен в производной классе, этот метод должен быть объявлен как виртуальный (конечно, при помощи ключевого слова vi rtual):
public class Employee {
// Для aeroqa GiveBonusO предусмотрена реализация по умолчанию. // однако он может быть замещен в производных классах public virtual void GiveBonus(float amount)
{
currPay amount:
і
Г
І-хліл вы хотите переопределить виртуальный метод, необходимо заново определит ь этот метод в производном классе, использовав ключевое слово override:
public class Salesperson : йщсоуае

// На размер поощрения продавцу будет влиять объем его продаж public override void GiveBonusCfloat amount)
int salesBonus = 0:
If(numberOfSales >= 0 && numberOfSales <=100) salesBonus = 10;
else if (numberOfSales > salesBonus - 15;
else
salesBonus = 20
101 numberOfSales 200)
// Для объема продаж больше 200 base GrveBomis (amount * salesBonus):
}
}
public class Manager : Employee {
private Random г = new Ranc'omO;
// Помич:: денег менеджеры также получают некоторое количество опционов // на акции
170 Глава 3 • и объектно-ориентированное программирование
public override void GiveBonusff 1 oat amount)
Il Деньги: увеличиваем зарплату base.Gi veBonu s(amount):
Il Опционы на акции: увеличиваем их количество numberOfOptions += (ulong)г-Next(500);
}
Г
Обратите внимание, что в определении каждого из замещенных методов используется вызов этого же метода базового класса. Таким образом, нет необходимости заново определять всю логику замещенного метода в производном классе: вполне достаточно воспользовіпi.f>' вариантом метода по умолчанию, определенном в базової' классе, дополнив его нужными вам действиями.
Метод EiTipl oyee. Di spl ayStats () у нас также определен как vi rtual, и он замещен в производных классах таким образом, чтобы показывать текущий объем продаж, если речь идет о продавце, или количество опционов, имеющееся в і кулияі щ:е время в распоряжении менеджера. Теперь, когда для каждого из производных классов определены собственные варианты этих двух методов, объекты разных классов ведут себя по-разному:
Предыдущая << 1 .. 68 69 70 71 72 73 < 74 > 75 76 77 78 79 80 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100