Модификатор virtual
Метод с virtual имеет реализацию в
базовом классе, но наследник может заменить
её через override.
Вызов через переменную базового типа тогда
использует версию фактического объекта.
Без virtual перекрытие возможно только
через new со скрытием.
Синтаксис
public virtual тип Метод()
{
// тело в базе
}
Пример
Давайте вызовем виртуальный метод без перекрытия:
using System;
class BaseRow
{
public virtual string GetText()
{
return "abcde";
}
}
class DerivedRow : BaseRow
{
}
class Program
{
static void Main()
{
BaseRow item = new DerivedRow();
Console.WriteLine(item.GetText());
}
}
Результат выполнения кода:
"abcde"
Пример
Давайте перекроем виртуальный метод в наследнике:
using System;
class BaseCode
{
public virtual string GetCode()
{
return "12345";
}
}
class CustomCode : BaseCode
{
public override string GetCode()
{
return "abcde";
}
}
class Program
{
static void Main()
{
BaseCode item = new CustomCode();
Console.WriteLine(item.GetCode());
}
}
Результат выполнения кода:
"abcde"
Пример
Давайте объявим виртуальное свойство:
using System;
class BaseLen
{
public virtual int Length => 5;
}
class LongLen : BaseLen
{
public override int Length => 10;
}
class Program
{
static void Main()
{
BaseLen item = new LongLen();
Console.WriteLine(item.Length);
}
}
Результат выполнения кода:
10
Смотрите также
-
override,
который подменяет виртуальную реализацию -
abstract,
который требует перекрытия без тела в базе -
override и new,
которые по-разному меняют унаследованный член -
base,
которое вызывает версию метода из базы