День сто двадцать шестой. #ВопросыНаСобеседовании
Самые часто задаваемые вопросы на собеседовании по C#
13. В чем разница между поздним и ранним связыванием в C#?
Концепции раннего связывания и позднего связывания относятся к полиморфизму в C#. Полиморфизм - это особенность объектно-ориентированного программирования, позволяющая языку использовать одно и то же имя метода в разных формах.
Есть 2 способа достижения этого:
1. Во время компиляции – статический полиморфизм, раннее связывание или перегрузка (overloading).
2. Во время выполнения – динамический полиморфизм, позднее связывание или переопределение (overriding).
Полиморфизм времени компиляции или раннее связывание
При перегрузке методы имеют одно и то же имя, но разные сигнатуры. Это также известно, как полиморфизм времени компиляции, поскольку решение о том, какой метод вызывать, принимается во время компиляции. Компилятор C# проверяет количество передаваемых параметров и типы параметров и принимает решение, какой метод вызывать, либо выдаёт ошибку времени компиляции, если подходящий метод не найден:
Здесь имена и сигнатуры методов (количество параметров и типы параметров) должны быть одинаковыми, однако методы могут иметь различную реализацию. Переопределение метода может быть выполнено с использованием наследования. Компилятор решает, какой метод вызывать, во время выполнения. Если доступен переопределённый метод, будет вызван он, в противном случае будет вызван метод базового класса. В следующем примере классы
Самые часто задаваемые вопросы на собеседовании по C#
13. В чем разница между поздним и ранним связыванием в C#?
Концепции раннего связывания и позднего связывания относятся к полиморфизму в C#. Полиморфизм - это особенность объектно-ориентированного программирования, позволяющая языку использовать одно и то же имя метода в разных формах.
Есть 2 способа достижения этого:
1. Во время компиляции – статический полиморфизм, раннее связывание или перегрузка (overloading).
2. Во время выполнения – динамический полиморфизм, позднее связывание или переопределение (overriding).
Полиморфизм времени компиляции или раннее связывание
При перегрузке методы имеют одно и то же имя, но разные сигнатуры. Это также известно, как полиморфизм времени компиляции, поскольку решение о том, какой метод вызывать, принимается во время компиляции. Компилятор C# проверяет количество передаваемых параметров и типы параметров и принимает решение, какой метод вызывать, либо выдаёт ошибку времени компиляции, если подходящий метод не найден:
public class TestDataПолиморфизм времени выполнения или позднее связывание
{
public int Add(int a, int b, int c)
{
return a + b + c;
}
public int Add(int a, int b)
{
return a + b;
}
}
…
TestData data = new TestData();
int sum1 = dataClass.Add(45, 34, 67);
int sum2 = dataClass.Add(23, 34);
Здесь имена и сигнатуры методов (количество параметров и типы параметров) должны быть одинаковыми, однако методы могут иметь различную реализацию. Переопределение метода может быть выполнено с использованием наследования. Компилятор решает, какой метод вызывать, во время выполнения. Если доступен переопределённый метод, будет вызван он, в противном случае будет вызван метод базового класса. В следующем примере классы
A
и B
переопределяют метод ToString
базового класса object
. Поэтому при выводе их в консоль будут использованы переопределённые версии, а при выводе класса C
будет использован метод ToString
базового класса object
:public class AВывод:
{
public override string ToString() => "Class A";
}
public class B
{
public override string ToString() => "Class B";
}
public class C {}
…
var objects = new object[] { new A(), new B(), new C() };
foreach (var obj in objects)
{
Console.WriteLine(obj);
}
Class AИсточник: https://www.c-sharpcorner.com
Class B
ConsoleApp1.C