#20 - Виртуальные методы

#20 - Виртуальные методы

В этом уроке мы затронем такую тему как виртуальные методы в C#, а также переопределение методов благодаря виртуальным методам

Видеоурок

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

Предположим, что у нас есть основной класс Транспорт. На основе этого класса можно создавать классы наследники (Мотоцикл, Автомобиль, Грузовик и так далее). В классе Транспорт у нас прописан метод, который отвечает за езду всех транспортных средств. Через определенное время мы создаем новый класс, который предназначен для машин с возможностью полета в небе. Благодаря полиморфизму мы можем изменить метод отвечающий за езду транспортных средств, при этом он будет изменен только для этого класса. Мы укажем, что машина может не только ездить, но и летать. При этом по-прежнему будем ссылаться повсюду на один и тот же метод, но теперь его функциональность совершенно будет разной. Для всех классов транспорт будет просто ездить, но для нашего класса машина будет еще уметь летать. Согласитесь, это очень удобно!
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 месяца

Также стоит посмотреть

Изучение ASP.NET Core MVC. Создание сайтов на C#
10 уроков
Уроки C# под Unity 5 для начинающих
9 уроков
Изучение C#, ASP.NET и создание Windows программ