2016-06-04 2 views

ответ

3

Допустим, у нас есть два класса, объявленные A и B следующим образом:

internal class A 
{ 
    internal virtual void Test() => Console.WriteLine("A.Test()"); 
} 

internal class B : A 
{ 
    internal override void Test() => Console.WriteLine("B.Test()"); 
} 

B наследует от A и переопределяет метод Test который выводит сообщение на консоль.


В чем разница между типом времени выполнения и времени компиляции типа в C#

Теперь давайте рассмотрим следующее заявление:

A test = new B();

  • во время компиляции: компилятор знает только, что переменная test имеет тип A. Он не знает, что мы на самом деле даем ему пример B. Поэтому компиляционный тип test равен A.

  • во время выполнения: тип test, как известно, B и, следовательно, имеет тип времени выполнения B


и какие последствия существуют в отношении виртуального вызова метода

Рассмотрите следующий код st atement:

((A)new B()).Test();

Мы создаем экземпляр B приведения его в тип A и вызова метода Test() на этом объекте. Тип компилятора - A, а тип выполнения - B.

Когда компилятор хочет разрешить вызов .Test(), у него есть проблема. Поскольку A.Test() - virtual, компилятор не может просто вызвать A.Test, потому что хранимый экземпляр мог бы переопределить метод.

Сам компилятор не может определить, какой из методов следует назвать A.Test() или B.Test(). Метод, который вызывается, определяется временем выполнения, а не «жестко запрограммированным» компилятором.

+0

Отличный ответ очень легко понять. Спасибо! – jpchauny

+0

Спасибо. Спасибо, что нашли время, чтобы набрать наш очень четкий ответ. Очень признателен. –

Смежные вопросы