Перегрузка, переопределение и перекрытие метода в C#

В C# существуют три важных механизма, связанных с полиморфизмом: перегрузка метода (method overloading), переопределение метода (method overriding) и перекрытие метода (method hiding). Несмотря на схожие названия, они имеют различные цели и применяются в разных ситуациях.

Перегрузка метода (Method Overloading)

Перегрузка метода – это возможность объявлять несколько методов с одинаковым именем, но разными параметрами (различие в их количестве или типах). Выбор нужного метода происходит на этапе компиляции.

class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
    
    public double Add(double a, double b)
    {
        return a + b;
    }
}

Здесь метод Add перегружен: одна версия принимает int, другая – double.

Переопределение метода (Method Overriding)

Переопределение метода используется в объектно-ориентированном программировании, когда метод в базовом классе помечается как virtual, а в производном классе он переопределяется с помощью ключевого слова override.

class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("Animal makes a sound");
    }
}

class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Dog barks");
    }
}

В этом примере метод MakeSound из Animal переопределён в Dog, изменяя его поведение.

Перекрытие метода (Method Hiding)

Перекрытие метода применяется, когда метод в производном классе использует ключевое слово new, скрывая метод из базового класса без его переопределения.

class BaseClass
{
    public void Show()
    {
        Console.WriteLine("BaseClass Show");
    }
}

class DerivedClass : BaseClass
{
    public new void Show()
    {
        Console.WriteLine("DerivedClass Show");
    }
}

Здесь метод Show в DerivedClass скрывает метод Show из BaseClass, но не переопределяет его.

Перегрузка, переопределение и перекрытие методов – важные механизмы ООП в C#. Они позволяют улучшить гибкость кода, но важно правильно понимать их различия и применять их в соответствующих ситуациях.