C#. Переопределение и скрытие методов

Переопределение и скрытие методов

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

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

Представьте, что в определенный момент разработки, Вы понимаете, что метод базового класса (а точнее его реализация) в производном (в производный класс, он попал «по наследству»), работает не так как Вы хотите! И тогда, вы решаете создать подобный метод в производном классе, но с доработанной реализацией. Причем, Вы не хотите придумывать для этого метода какое-то новое название. По двум причинам, во-первых, у метода уже отличное название, а во-вторых Вы не хотите, чтобы пользователю класса был доступен «неподходящий» метод, пришедший из базового класса (замену которому Вы и собираетесь разрабатывать). На практике, это может выглядеть примерно так:

//Базовый класс
class FirstClass
{
    //Самый важный метод
    public void DoSomthing()
    {
        //Выводим в консоль, что это метод базового класса
        Console.WriteLine("FirstClass.DoSomething");
    }
}

//Производный класс
class SecondClass : FirstClass
{
    //Тот же важнейший метод что и в базовом
    public new void DoSomthing()
    {
        //Но с другой реализацией (выводим в консоль, что это метод производного класса)
        Console.WriteLine("SecondClass.DoSomething");
    }
}

Обратите внимание на выделенную строку. Как видите, в производном классе мы тоже объявили метод «DoSomthing», с таким же прототипом, что и в базовом классе. Но есть одна важная деталь, так как мы решили скрыть метод базового класса, заменив его новым методом, мы указали ключевое слово new сразу после модификатора доступа public.

А теперь, давайте разберемся с переопределением методов базового класса в производном. Тут ситуация немного другая, переопределение методов применяется тогда, когда метод базового класса является виртуальным (для чего нужны виртуальные методы, я рассказывал в уроке № 22 базового курса C#). Давайте модифицируем наш базовый класс, сделав его главный метод виртуальным:

//Базовый класс
class FirstClass
{
    //Самый важный метод (виртуальный)
    public virtual void DoSomthing()
    {
        //Выводим в консоль, что это метод базового класса
        Console.WriteLine("FirstClass.DoSomething");
    }
}

Теперь метод «DoSomthing» стал виртуальным. И тогда, чтобы не скрыть, а переопределить этот метод в производном классе, нужно использовать ключевое слово override, вместо new, как показано в примере ниже:

//Производный класс
class SecondClass : FirstClass
{
    //Тот же важнейший метод что и в базовом (переопределенный)
    public override void DoSomthing()
    {
        //Но с другой реализацией (выводим в консоль, что это метод производного класса)
        Console.WriteLine("SecondClass.DoSomething");
    }
}

Как видите, всё довольно просто! Да это только основные варианты использования ключевых слов new и override по отношению к методам класса, есть еще ряд нюансов, но на начальном уровне изучения, достаточно и основных моментов. Главное запомнить, что ключевое слово new скрывает метод базового класса (в том числе и виртуальный), а override переопределяет виртуальный метод базового класса.

Добавить комментарий