
#20 - Виртуальные методы
Видеоурок
Полиморфизм является одной из концепций объектно ориентированного программирования. Благодаря полиморфизму мы можем переопределять методы родительского класса в классах наследниках.
Зачем нужен полиморфизм?
Предположим что у нас есть один большой класс «Транспорт». В нём прописаны методы:
- вывод всей информации;
- установка полей класса;
- запуск двигателя (на данный момент выводит лишь текст про запуск двигателя).
На основе класса мы создаем два класса наследника: «Car» и «Airplane». В каждом из классов-наследников мы будем иметь доступ ко всем методам из класса «Транспорт».
Мы явно понимаем, что метод «запуск двигателя» должен иметь разную реализацию у двух классов. Как мы можем заменить методы:
- Можем создать в каждом классе новые методы, что будут релевантны конкретному классу. Из минусов то, что каждый метод будет иметь новое название и нам сложно будет запомнить все названия методов для всех классов;
- Можем создать переопределение методов. Для этого необходимо прописать такое же имя как в главном классе и далее прописать новое содержимое для метода. Получается явный плюс, так как теперь повсюду используется одно имя и в зависимости от разных классов будет вызываться разный метод, но под одним и тем же именем.
В ООП вы можете переопределять неограниченное количество методов и указывать для них новые свойства и действия.
Реализация программы
Пример реализации виртуальных методов приведен ниже:
using System;
namespace ProjectOne {
class Shape {
public virtual void saysSomething () {
Console.Write("No! ");
}
}
class Square : Shape {
public override void saysSomething () {
base.saysSomething ();
Console.Write("But I will say something!");
}
}
class MainClass {
public static void Main(String[] args) {
Square test = new Square();
test.saysSomething (); // Будет выведено - "No! But I will say something!"
}
}
}
Для создания подобных методов необходимо прописать в главном классе ключевое слово virtual
перед типом данных, а в классах наследнике слово override
.
Исходный код
using System;
using System.Collections.Generic;
namespace ProjectOne {
class Animal {
public string Name { get; set; }
public Animal (string name) {
Name = name;
}
public virtual void Print () {
Console.WriteLine (Name);
}
}
class Dog : Animal {
private float speed;
public Dog (float speed, string name) : base (name) {
this.speed = speed;
}
public override void Print () {
base.Print ();
Console.WriteLine ("Dog speed: " + speed);
}
}
class Cat : Animal {
private float speed;
public Cat (float speed, string name) : base (name) {
this.speed = speed;
}
public override void Print () {
base.Print ();
Console.WriteLine ("Cat speed: " + speed);
}
}
class MainClass {
public static void Main (string[] args) {
List<Animal> animals = new List<Animal> ();
animals.Add (new Dog (12.23f, "Alex"));
animals.Add (new Dog (12.3f, "Tom"));
animals.Add (new Cat (12.3f, "Meow"));
foreach (Animal animal in animals) {
animal.Print ();
}
Console.ReadKey ();
}
}
}
Задание к уроку
Необходимо оформить подписку на проект, чтобы получить доступ ко всем домашним заданиям
Большое задание по курсу
Вам необходимо оформить подписку на сайте, чтобы иметь доступ ко всем большим заданиям. В задание входит методика решения, а также готовый проект с ответом к заданию.
PS: подобные задания доступны при подписке от 1 месяца
Также стоит посмотреть