Top.Mail.Ru

Язык С#. ООП. Полиморфизм

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

Чтобы использовать полиморфизм, необходимо чтобы:

  • все классы являлись наследниками одного и того же абстрактного  базового класса;
  • функция, реализующая метод, должна быть объявлена абстрактной в базовом классе с использованием ключевого слова abstract, и затем переопределена в производном классе с помощью ключевого слова override.

Класс называется абстрактным, если он имеет хотя бы один абстрактный метод и в заголовке спецификатор abstract.

Метод называется абстрактным, если при определении метода не задана реализация метода. Такой метод обозначается спецификатором  abstract.

В производном классе переопределяемый абстрактный метод должен содержать спецификатор override.

Ссылки на объекты производных классов совместимы по типу с ссылками на объекты базового класса. Однако, ссылки производных классов между собой не совместимы.

 

ПРИМЕР: Объявить абстрактный класс Person. Объявить два производных класса – Student и Teach. В каждом из классов объявить метод, с помощью которого можно создать список выдающихся педагогов и студентов. Студентов со средним баллом больше 4.8 и педагогов с числом публикаций более 10 статей считать выдающимися.

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 namespace abstract_klass

{

    abstract class Person

    {

       string name;   //Фамилия

       public void SetName()        // Метод запроса фамилии

         {   Console.Write("Фамилия :");  name = Console.ReadLine(); }

       public void GetName()      // Метод вывода фамилии 

         {   Console.WriteLine(" Господин "+name);   }

  //реализация следующих методов будет определена в потомках      

            public abstract void SetData();   // Метод запроса данных

            public abstract bool SetStat();   //  Метод определения выдающейся личности

    }

     class Student:Person   //производный класс  Студент

    {      double ball;     //средний балл студента

     public override void SetData()     // Метод запроса данных по студенту

        {       Console.WriteLine("Студент:");

                 base.SetName();    // вызов метода базового класса Person

                Console.Write("Средний балл:");

                string s;

                s = Console.ReadLine();

                ball = Convert.ToDouble(s);

            }

  public override bool SetStat()   // Метод определения выдающегося студента 

{ if (ball > 4.8) { base.GetName(); Console.Write("Средний балл=" + ball); return true; } else return false; }

 }

  class Teach : Person    //производный класс  Преподаватель

    {      int kol;          // количество публикаций преподавателя

     public override void SetData()   // Метод запроса данных по преподавателю

        {     Console.WriteLine("Преподаватель");

              base.SetName();     // вызов метода базового класса Person

              Console.Write("Кол-во публикаций:");

              string s;

              s = Console.ReadLine();

              kol = Convert.ToInt32(s);

            }

  public override bool SetStat()  // Метод определения выдающегося преподавателя 

   { if (kol > 10) { base.GetName(); Console.Write("Количество публиаций=" + kol); return true; } else return false; }

   }

 class Program

    {

        static void Main(string[] args)

        {

            Person[]ob = new Person[5];   //массив ссылок

            int n = 0;  string s,s1;

          do{

               Console.WriteLine("Студент(s) / Преподаватель(t)?"); 

               s=Console.ReadLine();

              if (s=="s") ob[n] = new Student(); // создаем объект класса Студент

              if (s=="t") ob[n] = new Teach();   // создаем объект класса Преподаватель

              ob[n].SetData();        // вызов метода соответствующего производного класса

              n++;

              Console.WriteLine("y/n?");

              s1 = Console.ReadLine();

           }while (s1=="y");

          for (int i = 0; i < n; i++)   // проверка на выдающуюся личность

                     {

                          if (ob[i].SetStat()) {  Console.WriteLine("  Это выдающаяся личность! "); }

                     }

         Console.ReadLine();

         }

    }

}