← Назад к вопросам

Приведи пример полиморфизма

1.2 Junior🔥 221 комментариев
#ООП и паттерны проектирования#Основы C# и .NET

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пример полиморфизма в C#

Полиморфизм — это один из ключевых принципов объектно-ориентированного программирования (ООП), позволяющий объектам разных классов обрабатываться через общий интерфейс. В C# полиморфизм достигается через наследование, виртуальные методы и абстрактные классы или интерфейсы. Проще говоря, это возможность использовать один и тот же метод для объектов разных типов, причём каждый тип реализует этот метод по-своему.

Ключевые виды полиморфизма в C#

  1. Статический (перегрузка методов) — методы с одним именем, но разными параметрами.
  2. Динамический (переопределение методов) — использование виртуальных методов и модификатора 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 и других фреймворках, где требуется работа с различными реализациями через общие контракты (интерфейсы).

Приведи пример полиморфизма | PrepBro