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

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

2.0 Middle🔥 121 комментариев
#C# и ООП

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

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

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

Примеры типов полиморфизма в программировании

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

1. Параметрический полиморфизм (Generics)

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

// Обобщённый класс
public class Container<T>
{
    private T item;
    
    public void SetItem(T newItem)
    {
        item = newItem;
    }
    
    public T GetItem()
    {
        return item;
    }
}

// Использование с разными типами
Container<int> intContainer = new Container<int>();
intContainer.SetItem(42);

Container<string> stringContainer = new Container<string>();
stringContainer.SetItem("Hello Unity");

2. Полиморфизм подтипов (Наследование)

Самый распространённый тип в Unity, где дочерние классы могут переопределять методы родительских классов.

// Базовый класс
public abstract class Enemy
{
    public virtual void Attack()
    {
        Debug.Log("Enemy attacks!");
    }
    
    public abstract void TakeDamage(int damage);
}

// Производные классы
public class Zombie : Enemy
{
    public override void Attack()
    {
        Debug.Log("Zombie bites!");
    }
    
    public override void TakeDamage(int damage)
    {
        // Реализация для зомби
    }
}

public class Skeleton : Enemy
{
    public override void Attack()
    {
        Debug.Log("Skeleton swings sword!");
    }
    
    public override void TakeDamage(int damage)
    {
        // Реализация для скелета
    }
}

// Использование
Enemy[] enemies = new Enemy[] { new Zombie(), new Skeleton() };
foreach (Enemy enemy in enemies)
{
    enemy.Attack(); // Вызовется соответствующая реализация
}

3. Ad-hoc полиморфизм (Перегрузка методов)

Позволяет создавать несколько методов с одинаковым именем, но разными параметрами.

public class Calculator
{
    // Перегрузка метода Add
    public int Add(int a, int b)
    {
        return a + b;
    }
    
    public float Add(float a, float b)
    {
        return a + b;
    }
    
    public int Add(int a, int b, int c)
    {
        return a + b + c;
    }
    
    public string Add(string a, string b)
    {
        return a + b;
    }
}

// Компилятор выберет нужную версию метода
Calculator calc = new Calculator();
int result1 = calc.Add(5, 10);          // Вызовется Add(int, int)
float result2 = calc.Add(3.5f, 2.1f);   // Вызовется Add(float, float)
string result3 = calc.Add("Hello", " World"); // Вызовется Add(string, string)

4. Полиморфизм через интерфейсы

Интерфейсы определяют контракт, который могут реализовывать разные классы.

// Интерфейс
public interface IDamageable
{
    void TakeDamage(int damage);
    int Health { get; }
}

// Разные классы реализуют один интерфейс
public class Player : MonoBehaviour, IDamageable
{
    public int Health { get; private set; } = 100;
    
    public void TakeDamage(int damage)
    {
        Health -= damage;
        Debug.Log($"Player health: {Health}");
    }
}

public class Building : MonoBehaviour, IDamageable
{
    public int Health { get; private set; } = 500;
    
    public void TakeDamage(int damage)
    {
        Health -= damage / 2; // Здания получают меньше урона
        Debug.Log($"Building health: {Health}");
    }
}

// Обработка разных объектов через общий интерфейс
void ApplyDamageToAll(IDamageable[] targets, int damage)
{
    foreach (var target in targets)
    {
        target.TakeDamage(damage);
    }
}

Практическое применение в Unity

В Unity полиморфизм используется повсеместно:

  • Компонентная система: GetComponent<T>() использует дженерики
  • Обработка событий: разные объекты могут по-разному реагировать на события
  • Система состояний: паттерн State Machine часто реализуется через полиморфизм
  • Пул объектов: общая логика для разных типов объектов

Ключевые преимущества полиморфизма в разработке игр:

  • Уменьшение дублирования кода
  • Повышение гибкости и расширяемости
  • Упрощение поддержки и модификации
  • Более чистая архитектура проекта

На практике в Unity я часто комбинирую разные типы полиморфизма. Например, создаю обобщённую систему сохранения (дженерики), которая работает с разными типами данных через общий интерфейс, где каждый класс реализует свою логику сериализации. Это позволяет создавать масштабируемые и поддерживаемые системы, что критически важно в долгосрочной разработке игровых проектов.