Язык программирования C#
- Муслимова А. Г.
- Уроки по языку программирования С#
- Просмотров: 4383
Язык С#. ООП. Полиморфизм
Полиморфизм – свойство, которое позволяет использовать одно и то же имя функции для решения двух и более схожих, но технически разных задач.
Чтобы использовать полиморфизм, необходимо чтобы:
- все классы являлись наследниками одного и того же абстрактного базового класса;
- функция, реализующая метод, должна быть объявлена абстрактной в базовом классе с использованием ключевого слова 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();
}
}
}