Файл: 10. Разработка универсальных полиморфных контейнеров.pdf

Добавлен: 20.10.2018

Просмотров: 1059

Скачиваний: 9

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

 

};

 

 

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;

 


background image

 

 

                     

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;   // и здесь разные версии! 


background image

 

 

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    ВсеСотр[ номерСотр ].Расчет( );}  // и здесь разные версии! 

};

 

 


background image

 

 

Шаг 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); 

. . . . . . . . . . .  // создание и добавление остальных сотрудников 

Коллектив. Ведомость( ); // расчет и вывод зарплатной ведомости