Можете объяснить концепцию полиморфизма в объектно-ориентированном программировании?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Полиморфизм — это возможность работать с объектами разных типов через общий интерфейс или базовый класс. При этом один и тот же вызов ведёт себя по-разному в зависимости от реального типа объекта. В C# это обычно показывают через virtual/override и через интерфейсы.
Определение:
Полиморфизм в ООП — это принцип, при котором один и тот же контракт использования может иметь разные реализации. Код обращается к объектам через общий тип, а конкретное поведение определяется фактическим типом экземпляра во время выполнения.
В C# полиморфизм чаще всего проявляется в двух формах:
- параметрический/подтиповый — работа через базовый класс или интерфейс;
- динамический — переопределение методов (
virtual,override).
Пример использования:
Например, есть интерфейс IShape, а разные фигуры по-своему считают площадь. Код, который печатает площадь, не знает конкретный тип фигуры и работает одинаково для всех реализаций.
using System;
using System.Collections.Generic;
interface IShape
{
double Area();
}
class Circle : IShape
{
public double Radius { get; }
public Circle(double radius)
{
Radius = radius;
}
public double Area()
{
return Math.PI * Radius * Radius;
}
}
class Rectangle : IShape
{
public double Width { get; }
public double Height { get; }
public Rectangle(double width, double height)
{
Width = width;
Height = height;
}
public double Area()
{
return Width * Height;
}
}
class Program
{
static void Main()
{
List<IShape> shapes = new List<IShape>
{
new Circle(3),
new Rectangle(4, 5)
};
foreach (var shape in shapes)
{
Console.WriteLine(shape.Area());
}
}
}
Пояснение кода:
Код показывает полиморфизм через интерфейс.
IShapeзадаёт общий контракт: у любой фигуры должен быть методArea().CircleиRectangleреализуют этот контракт по-своему.- В списке
List<IShape>хранятся объекты разных типов, но все они доступны через общий интерфейс. - В цикле вызывается
shape.Area(), и для каждого объекта выполняется своя реализация. - Благодаря этому код клиента не зависит от конкретных классов фигур.
Ключевые моменты:
- Полиморфизм позволяет писать код против абстракций, а не конкретных классов.
- Один и тот же вызов метода может давать разный результат для разных объектов.
- В C# полиморфизм удобно реализуется через интерфейсы и переопределение методов.
- Это упрощает расширение системы: новые типы можно добавлять без изменения клиентского кода.
- Полиморфизм повышает читаемость, гибкость и тестируемость кода.