Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Виртуальные методы.

Метод базового класса, которому при определении был указан модификатор virtual, и который был переопределен в одном или более потомственных классов называется виртуальным методом класса. Каждый наследник может иметь собственную версию виртуального метода. При вызове такого метода класса, выбор конкретной версии зависит от того типа объекта, на который ссылается ссылочная переменная, осуществляющая вызов. Выбор производится во время выполнения программы.

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

Кстати понятие виртуального метода вам уже известно из курса. С++. Рассмотрим пример:

using System;
class Animal{
	public Animal(string n){
		name=n;
	}
	private string name;
	public virtual void Sound(){ // виртуальный метод
		Console.WriteLine("Неизвестный Звук !!!");
	}
	public void ShowName(){
		Console.WriteLine(name);
	}
}
class Cat:Animal{
	public Cat(string name):base(name){}
	public override void Sound(){// переопределение виртуального метода
		Console.WriteLine("Мяу !!!");
	}
}
class Dog:Animal{
	public Dog(string name):base(name){}
	public override void Sound(){
		Console.WriteLine("Гав !!!");
	}
}

class Sample
{
	static void Main() 
	{
		try{
			Animal p;
			Animal obj = new Animal("Неизвестное имя");
			Cat obj2 = new Cat("Мурка");
			Dog obj3 = new Dog("Полкан");
			p = obj;		
			p.Sound();// Animal::Sound
			p = obj2;
			p.Sound();//Cat::Sound
			p = obj3;
			p.Sound();//Dog::Sound
			
		}
		catch(Exception e){
			Console.WriteLine(e.Message);
		}
		Console.Read();
	}
}

Если в каком-то потомке виртуальный метод не переопределен, то тогда при вызове его используется метод базового класса. Давайте рассмотрим ещё один пример использования виртуальных методов:

using System;
class Animal{
	public Animal(string n){
		name=n;
	}
	private string name;
	public virtual void Sound(){
		Console.WriteLine("Неизвестный Звук !!!");
	}
	public void ShowName(){
		Console.WriteLine(name);
	}
}
class Cat:Animal{
	public Cat(string name):base(name){}
	public override void Sound(){
		Console.WriteLine("Мяу !!!");
	}
}
class Dog:Animal{
	public Dog(string name):base(name){}
	public override void Sound(){
		Console.WriteLine("Гав !!!");
	}
}

class Sample
{
	static void Main() 
	{
		try{
			Animal[] arr = new Animal[3];
			arr[0] = new Animal("Без имени");
			arr[1] = new Cat("Василий");
			arr[2] = new Dog("Мелодия");
			for(int i = 0;i<arr.Length;i++){
				arr[i].Sound();
			}
		}
		catch(Exception e){
			Console.WriteLine(e.Message);
		}
		Console.Read();
	}
}


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru