Файл: 10. Разработка универсальных полиморфных контейнеров.pdf
ВУЗ: Университет управления «ТИСБИ»
Категория: Учебное пособие
Дисциплина: Объектно-ориентированное программирование
Добавлен: 20.10.2018
Просмотров: 1059
Скачиваний: 9
};
class Окладник: Сотрудник
{ private int Оклад;
private float Ставка;
public Окладник (string фам, string должн, int оклад, float ставка)
: Сотрудник (фам, должн) {…};
public override float Расчет( ) { return Оклад * Ставка };
};
class Почасовик: Сотрудник
{ private int ОтрабЧасов, ЧасСтавка;
public Почасовик(…) : Сотрудник (фам, должн) {…};
public override float Расчет( ) { return ОтрабЧасов * ЧасСтавка};
};
Шаг 5. Разработка контейнерного класса (минимальная конфигурация)
Container = class
private
Sotrs = array of TSotr ; //динамический массив полиморфных ссылок
count : integer;
public constructor Create ( size : integer );
procedure AddSotr (aSotr : TSotr );
function DelSotr (aFam : string) : boolean;
procedure Vedomost;
function GetZarpl ( nom : integer) : real;
end;
// реализация некоторых методов
// простейший вариант метода Vedomost (может быть использован в
консольной программе)
procedure Container.Vedomost;
var i : integer;
sumZarpl : real; // накапливаем суммарную зарплату
begin
sumZarpl := 0;
// при проходе по массиву сотрудников используем полиморфизм!
for i := 0 to count-1 do
begin
sumZarpl := sumZarpl + Sotrs[ i ].Zarplata;
// вызов разных версий метода Zarplata!
writeln (Sotrs[ i ].GetFam + ' ' + Sotrs[ i ].Zarplata);
end;
writeln ( ' ВСЕГО: ' + sumZarpl );
end;
// простейший вариант метода получения зарплаты сотрудника с заданным
номером (метод может быть использован в оконных приложениях)
function Container.GetZarpl ( nom : integer) : real;
begin
“проверка входного параметра nom”;
result := Sotrs[ nom ].Zarplata; // и здесь разные версии!
end;
class КонтейнерСотрудников
{ private Сотрудник [ ] ВсеСотр; //массив полиморфных ссылок
private int Количество;
public КонтейнерСотрудников (int Размер) { //код };
public void ДобавитьСотр (Сотрудник новый) { // код };
public bool УдалитьСотр (string фамилия) { // код }
public void Ведомость ( ) // далее - простейший вариант кода для
// консольного приложения
{ float суммЗарплата = 0;
for (int i = 0; i < Количество; i++)
// при проходе по массиву сотрудников используем полиморфизм!
{ суммЗарплата = суммЗарплата + ВсеСотр[ i].Расчет( );
// вызов разных версий метода Расчет!
WriteLine( ВсеСотр[ i].GetFam( ) + ' ' + ВсеСотр[ i].Расчет( );}
WriteLine ( 'ИТОГО: ' + суммЗарплата);
};
public float ЗарплатаСотрудника (int номерСотр )
// метод получения зарплаты сотрудника с заданным номером
// (можно использовать в оконных приложениях)
{ “ проверка входного параметра номерСотр“;
return ВсеСотр[ номерСотр ].Расчет( );} // и здесь разные версии!
};
Шаг 6. Разработка тестовой программы (фрагмент консольного
приложения).
var sotr : TSotr; // объявление полиморфной объектной переменной
kollectiv : Container; // переменная-контейнер
. . . . . . . . . .
kollectiv := Container.Create(20); // создание контейнера на 20 сотрудников
sotr := TSotrOklad.Create ('Бендер', 'директор', 50000, 1.5); //создание
kollectiv.AddSotr (sotr); // добавление сотрудника-окладника
kollectiv.AddSotr (TSotr.Pochas ('Балаганов', 'менеджер', 500, 100);
// а здесь сразу всѐ – и создание, и добавление в одном флаконе!
. . . . . . . . . . . // создание и добавление остальных сотрудников
kollectiv.Vedomost; // расчет и вывод зарплатной ведомости
КонтейнерСотрудников Коллектив = new Container(20);
// создание контейнера на 20 сотрудников
// создание и добавление сотрудника-окладника
Коллектив.ДобавитьСотр (new Окладник('Бендер', 'директор', 50000, 1.5);
// создание и добавление сотрудника-почасовика
Коллектив.ДобавитьСотр (new Почасовик('Балаганов', 'менеджер', 500, 10);
. . . . . . . . . . . // создание и добавление остальных сотрудников
Коллектив. Ведомость( ); // расчет и вывод зарплатной ведомости