Приведи пример полиморфизма
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Пример полиморфизма в C#
Полиморфизм — это один из ключевых принципов объектно-ориентированного программирования (ООП), позволяющий объектам разных классов обрабатываться через общий интерфейс. В C# полиморфизм достигается через наследование, виртуальные методы и абстрактные классы или интерфейсы. Проще говоря, это возможность использовать один и тот же метод для объектов разных типов, причём каждый тип реализует этот метод по-своему.
Ключевые виды полиморфизма в C#
- Статический (перегрузка методов) — методы с одним именем, но разными параметрами.
- Динамический (переопределение методов) — использование виртуальных методов и модификатора
override.
Рассмотрим практический пример динамического полиморфизма с иерархией классов, представляющих геометрические фигуры.
// Базовый абстрактный класс, определяющий общий интерфейс
public abstract class Shape
{
public abstract double CalculateArea(); // Абстрактный метод
public virtual void Display()
{
Console.WriteLine("Это геометрическая фигура.");
}
}
// Производный класс для круга
public class Circle : Shape
{
public double Radius { get; set; }
public Circle(double radius)
{
Radius = radius;
}
// Переопределение абстрактного метода
public override double CalculateArea()
{
return Math.PI * Radius * Radius;
}
// Переопределение виртуального метода (дополнение поведения)
public override void Display()
{
Console.WriteLine($"Круг с радиусом {Radius}.");
}
}
// Производный класс для прямоугольника
public class Rectangle : Shape
{
public double Width { get; set; }
public double Height { get; set; }
public Rectangle(double width, double height)
{
Width = width;
Height = height;
}
public override double CalculateArea()
{
return Width * Height;
}
public override void Display()
{
Console.WriteLine($"Прямоугольник {Width}x{Height}.");
}
}
// Производный класс для треугольника
public class Triangle : Shape
{
public double Base { get; set; }
public double Height { get; set; }
public Triangle(double @base, double height)
{
Base = @base;
Height = height;
}
public override double CalculateArea()
{
return 0.5 * Base * Height;
}
// Не переопределяем Display, используем реализацию базового класса
}
Использование полиморфизма
Теперь продемонстрируем, как полиморфизм позволяет работать с разными фигурами через общий интерфейс:
class Program
{
static void Main()
{
// Создаем коллекцию разных фигур
List<Shape> shapes = new List<Shape>
{
new Circle(5.0),
new Rectangle(4.0, 6.0),
new Triangle(3.0, 4.0)
};
// Полиморфное поведение: вызываем методы, не зная конкретного типа
foreach (var shape in shapes)
{
shape.Display(); // Вызовется соответствующая реализация
// Каждый объект вычисляет площадь по своей формуле
double area = shape.CalculateArea();
Console.WriteLine($"Площадь: {area:F2}");
Console.WriteLine(new string('-', 30));
}
}
}
Результат выполнения
Круг с радиусом 5.
Площадь: 78,54
------------------------------
Прямоугольник 4x6.
Площадь: 24,00
------------------------------
Это геометрическая фигура.
Площадь: 6,00
------------------------------
Анализ примера
В этом примере наглядно демонстрируется полиморфизм:
- Общий интерфейс: Все фигуры наследуются от базового класса
Shapeи реализуют методCalculateArea() - Разное поведение: При вызове
CalculateArea()для круга используется формула πr², для прямоугольника — умножение сторон, для треугольника — половина произведения основания на высоту - Единая точка входа: Метод
Mainработает с коллекцией объектов типаShape, не заботясь о конкретных типах фигур - Гибкость и расширяемость: Можно легко добавить новую фигуру (например,
Square), унаследовав отShapeи реализовавCalculateArea(), без изменения существующего кода
Преимущества полиморфизма
- Упрощение кода: Снижение сложности за счёт единообразной работы с объектами
- Расширяемость: Легкое добавление новых типов без изменения существующей логики
- Поддержка принципов SOLID:
- Принцип открытости/закрытости: Код открыт для расширения, но закрыт для модификации
- Принцип подстановки Барбары Лисков: Объекты производных классов могут заменять объекты базового класса
- Упрощение тестирования: Возможность использовать моки и стабы через общий интерфейс
Полиморфизм является фундаментальным механизмом в C#, который активно используется в ASP.NET Core, Entity Framework и других фреймворках, где требуется работа с различными реализациями через общие контракты (интерфейсы).