Учебно-методический комплекс общее количество часов 58 ч. Лекции 28 ч


Download 2.46 Mb.
bet44/91
Sana19.10.2023
Hajmi2.46 Mb.
#1709453
TuriУчебно-методический комплекс
1   ...   40   41   42   43   44   45   46   47   ...   91
Bog'liq
Язык программирования C#

9.4. Полиморфизм и виртуальные методы

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


Полиморфизм используется в тех случаях, когда на этапе компиляции неизвестно какому типу будет принадлежать тот или иной объект, то есть конкретный тип объекта выясняется только во время работы программы и может меняться в зависимость от обстоятельств.
На практике полиморфизм классов заключается в том, что производный класс может особым образом переопределить метод, свойство или индексатор, унаследованный от базового класса. В базовом классе переопределяемые в дальнейшем члены для создания полиморфной иерархии должны быть помечены спецификатором virtual, а при их переопределении используется спецификатор override, такие члены называются виртуальными. Такое особое переопределение имен дает возможность присвоить объекту базового класса объект класса производного, но при этом, когда будут вызваться переопределенные в производном классе поля, будет вызвана именно их новая версия. Такое переопределение имен можно назвать динамическими, в противоположность статическому их сокрытию.
В базовом классе виртуальные члены могут иметь спецификатор доступа либо public, либо protected, либо internal. В производном классе менять спецификатор доступа к виртуальному члену нельзя.
Общий формат использования виртуальных методов имеет следующий вид.


class базовый_класс
{
доступ virtual тип имя_метода(параметры)
{
// тело метода
}
}


class производный_класс : базовый_класс
{
доступ override тип имя_метода(параметры)
{
// тело метода
}
}

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


Проиллюстрируем использование виртуальных методов при помощи иерархии, состоящей из класса служащий Employee и производного от него класса преподаватель Teacher. У обоих этих классов должен быть метод выдать зарплату GiveSalary(). Преподаватель является частной формой служащего и поэтому наследует от класса Employee, но жалование преподавателя зависит от стажа, поэтому метод GiveSalary() сделаем виртуальным и реализуем в обоих классах по-разному.


class Employeee
{
protected string Name;
protected double Salary;

public virtual void GiveSalary()


{
Console.WriteLine("Выдать служащему{0} {1} сум", Name,
Salary);
}

public Employeee(string Name, double Salary)


{
this.Name = Name;
this.Salary = Salary;
}
}

class Teacher : Employeee


{
protected double LengthOfService;

public override void GiveSalary()


{
Console.WriteLine("Выдать преподавателю {0} {1} сум",
Name, Salary + Salary * LengthOfService * 0.4);
}

public Teacher(string Name, double Salary, double Length)


: base(Name, Salary)
{
LengthOfService = Length;
}
}
Лист. 9.12

Напишем для тестирования этой иерархии класс Program. К нему добавим метод расчет Pay() принимающий массив объектов класса Employee и вызывающий у каждого из них метод GiveSalary().


class Program


{
static void Pay(Employee[] Employees)
{
for (int i = 0; i < Employees.Length; i++)
Employees[i].GiveSalary();
}

static void Main(string[] args)


{
Employee[] Employees = new Employee[3];
Employees[0] = new Employee("Иванов", 120000);
Employees[1] = new Teacher("Тухтасинов", 150000, 15);
Employees[2] = new Teacher("Игнатьев", 100000000, 20);
Pay(Employees);
}
}
Лист. 9.13

В первой строке метода Main() создается массив Employees объектов класса Employee. Далее создаются отдельные элементы этого массива, при чем элементы массива относятся к разным классам: первый относится к классу Employee, а остальные два к классу Teacher.


Затем вызывается метод Pay(), который в свою очередь вызывает методы GiveSalary() всех объектов массива Employees.

Выдать служащему Иванов 120000 сум


Выдать преподавателю Тухтасинов 262500 сум
Выдать преподавателю Игнатьев 200000000 сум
Вывод 9.4

Как видно из вывода программы вызваны были именно методы соответствующие фактическому классу объекта.





Download 2.46 Mb.

Do'stlaringiz bilan baham:
1   ...   40   41   42   43   44   45   46   47   ...   91




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling