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

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

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

  • все классы являлись наследниками одного и того же абстрактного  базового класса;
  • функция, реализующая метод, должна быть объявлена абстрактной в базовом классе с использованием ключевого слова 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();
         }
    }
}
 
 

Добавить комментарий
  • Комментарии не найдены
 
DMC Firewall is developed by Dean Marshall Consultancy Ltd