- Автор темы
- #1
Виртуальные методы.
Метод базового класса, которому при определении был указан модификатор virtual, и который был переопределен в одном или более потомственных классов называется виртуальным методом класса. Каждый наследник может иметь собственную версию виртуального метода. При вызове такого метода класса, выбор конкретной версии зависит от того типа объекта, на который ссылается ссылочная переменная, осуществляющая вызов. Выбор производится во время выполнения программы.
Таким образом, если класс является родительским для нескольких других классов и при этом в нем существует виртуальный метод, переопределенный в потомках, то тогда при ссылке переменной базового типа на различные типы объектов базового и производного типов будут производиться вызовы различных версий. При переопределении виртуального метода в дочернем классе ему указывается модификатор override. В потомке имя метода, параметры остаются прежними, как и в базовом классе. По отношению к виртуальным методам нельзя применять модификаторы static,abstract.
Кстати понятие виртуального метода вам уже известно из курса. С++. Рассмотрим пример:
Если в каком-то потомке виртуальный метод не переопределен, то тогда при вызове его используется метод базового класса. Давайте рассмотрим ещё один пример использования виртуальных методов:
Метод базового класса, которому при определении был указан модификатор 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();
}
}