override и new
Если в базе метод помечен virtual
или abstract,
в наследнике пишут override -
тогда ссылка на базовый тип вызывает новую
версию. Ключевое слово new
создаёт отдельный член: через переменную базы
остаётся старая реализация.
Синтаксис
public override тип Метод() { }
public new тип Метод() { }
Пример
Давайте перекроем виртуальный метод через override:
using System;
class BaseA
{
public virtual string GetTag()
{
return "base";
}
}
class DerivedA : BaseA
{
public override string GetTag()
{
return "override";
}
}
class Program
{
static void Main()
{
BaseA item = new DerivedA();
Console.WriteLine(item.GetTag());
}
}
Результат выполнения кода:
"override"
Пример
Давайте скроем метод через new и сравним вызовы:
using System;
class BaseB
{
public string GetTag()
{
return "base";
}
}
class DerivedB : BaseB
{
public new string GetTag()
{
return "new";
}
}
class Program
{
static void Main()
{
var direct = new DerivedB();
BaseB viaBase = direct;
Console.WriteLine(direct.GetTag() + " " + viaBase.GetTag());
}
}
Результат выполнения кода:
new base
Пример
Давайте скроем new поле с тем же именем:
using System;
class BaseC
{
public int Code = 1;
}
class DerivedC : BaseC
{
public new int Code = 2;
}
class Program
{
static void Main()
{
var item = new DerivedC();
BaseC via = item;
Console.WriteLine(item.Code + " " + via.Code);
}
}
Результат выполнения кода:
2 1
Смотрите также
-
override,
который заменяет виртуальную реализацию -
new,
который скрывает унаследованный член -
virtual,
который разрешает перекрытие в наследнике -
наследование,
которое связывает базовый и производный тип