2010-10-01 7 views
7


В чем разница между полиморфизмом во время выполнения и полиморфизмом во время компиляции? Кроме того, в чем разница между ранним связыванием и поздним связыванием? Примеры будут высоко оценены.C# Полиморфизм

+7

Вам нужно задать вопрос * один *. Эти термины не имеют ничего общего. –

+3

Вам нужны примеры для google? –

+6

Должно ли это быть помечено как «домашнее задание»? – keyboardP

ответ

31

время компиляции полиморфизм

Метод перегрузка является отличным примером. У вас могут быть два метода с тем же именем, но с разными сигнатурами. Компилятор выберет правильную версию для использования во время компиляции.

Run-Time полиморфизм

переопределение виртуального метода из родительского класса в дочернем классе является хорошим примером. Еще один метод реализации класса из интерфейса. Это позволяет использовать более общий тип кода при использовании реализации, указанной дочерним элементом. Учитывая следующие определения классов:

public class Parent 
{ 
    public virtual void SayHello() { Console.WriteLine("Hello World!"); } 
} 

public class Child : Parent 
{ 
    public override void SayHello() { Console.WriteLine("Goodbye World!"); } 
} 

Следующий код выведет "Goodbye World!":

Parent instance = new Child(); 
instance.SayHello(); 

Early Binding

Определение типа во время компиляции:

SqlConnection conn = new SqlConnection(); 

Late Bind ING

Тип определяется во время выполнения:

object conn = Activator.CreateInstance("System.Data.SqlClient.SqlConnection"); 
+1

как сделать .Net Generics вписывается в картину здесь? В C++ шаблоны выражают полиморфизм времени компиляции. thx –

3

UPDATE: Пожалуйста, смотрите комментарии Eric LIPPERT к этому ответу.

В C# 2 все привязки ранние, потому что C# 2 является статически типизированным языком. Последним языком связывания будет тот, в котором привязка метода происходит во время выполнения. (C# 4 включает функцию позднего связывания с введением dynamic.)

Я не уверен, что вы подразумеваете под временем выполнения и полиморфизмом времени компиляции.

Компилятор C# будет определять во время компиляции, вызванную перегрузкой метода. Тип времени выполнения экземпляра определит, какая реализация конкретной обработки будет выполняться. Это по-прежнему считается ранним связыванием, даже если оно происходит во время выполнения, поскольку выбранный метод ограничивается реализацией перегрузки определенного виртуального метода, и такой вызов не может генерировать исключение, связанное с типом, например, может происходят с динамическим языком и поздним связыванием.

+0

C# 2 поддерживает позднюю привязку на уровне языка в виде * виртуальной отправки *. В виртуальных языках рассылки вызов метода * задерживается *, потому что вызванный * точный метод * не определяется до * runtime *. * Подпись * метода определяется во время компиляции, но метод *, который фактически называется *, не является. C# 4 поддерживает динамическое позднее связывание: он может определять * все * о методе (кроме его имени) во время выполнения. –

+0

Re: ваше обновление: Мнения меняются. Некоторые считают, что виртуальная диспетчеризация является поздней привязкой, потому что вызванный метод определяется во время выполнения. (Это, как правило, люди с фоном на C или некоторые другие, в основном, статические языки привязки.) Некоторые считают, что это раннее связывание, потому что * slot *, который будет содержать указатель метода, определяется во время компиляции. (Это, как правило, люди, которые привыкли к программированию на COM или C++, где практически каждый вызов является виртуальным.) Я лично стараюсь использовать только «поздний привязку» для обозначения «динамический». –

+0

@ Эрик Липперт - Хорошо, это имеет смысл. Ваше использование «позднего связывания» похоже похоже на мое. Я всегда думал о «раннем» и «позднем», чтобы указать, по сути, время, когда ошибка обнаруживается, когда что-то идет не так. Спасибо за ваши комментарии! –

3

Очень простой и прямой ответ за разницу между временем компиляции и полиморфизмом времени выполнения.

Полиморфизм времени компиляции - Перегрузка метода (с тем же именем метода, но с другой подписью).Пожалуйста, проверьте видео на метод перегрузки по этому адресу http://csharp-video-tutorials.blogspot.com/2012/06/part-25-c-tutorial-method-overloading.html

Run Time полиморфизм - Метод Переопределение (Вызов Дочерний класс переопределены методы во время выполнения, используя ссылочную переменную базового класса вызывается как во время выполнения полиморфизм). Пожалуйста, проверьте видео по переопределению метода (Полиморфизм) по этому адресу http://csharp-video-tutorials.blogspot.com/2012/06/part-23-c-tutorial-polymorphism.html

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