Сокрытие метода в С# - Блог ITVDN
ITVDN: курсы программирования
Видеокурсы по
программированию

    Выбери свою IT специальность

    Начать бесплатно

    Выбери свою IT специальность

    Начать бесплатно

      Сокрытие метода в С#

      Введение

      В данной статье Вы узнаете, как скрывать метод и как вызывать скрытые элементы базового класса. Рассмотрим это на конкретных примерах.


      Создадим в Visual Studio консольное дополнение с классом Student. У класса Student два поля: FirstName и LastName, и метод, который выводит FirstName и LastName на экране консоли.

      using System;

      namespace methodHidingInCSharp {

             class Student {

                   public string FirstName;

                   public string LastName;

                   public void PrintName() {

                          Console.WriteLine(FirstName + " " + LastName);

                   }

             }

             class Program {

                   static void Main(string[] args) {

                   }

             }

      }

      Создадим класс DiplomaStudent и GraduateStudent, которые унаследуют класс Student.

      using System;

      namespace methodHidingInCSharp {

             class Student {

                   public string FirstName;

                   public string LastName;

                   public void PrintName() {

                          Console.WriteLine(FirstName + " " + LastName);

                   }

             }

             class DiplomaStudent : Student {

             }

             class GraduateStudent : Student {

             }

             class Program {

                   static void Main(string[] args) {

                   }

             }

      }

      Если нужно создать объект класса DiplomaStudent и GraduateStudent, это можно сделать главным методом, например: 

      class Program {

             static void Main(string[] args) {

                   DiplomaStudent ds = new DiplomaStudent();

                   ds.FirstName = "Sam";

                   ds.LastName = "Fisher";

                   ds.PrintName();

                   GraduateStudent gs = new GraduateStudent();

                   gs.FirstName = "Aiden";

                   gs.LastName = "Pearce";

                   gs.PrintName();

             }

      }

      Так как классы DiplomaStudent и GraduateStudent наследуют класс Student, можно вызывать всех участников, кроме частных (приватных).

      При запуске проекта получим следующий результат:

      Результат проекта

      Результат вышел таким, как и предполагалось. Но есть небольшая проблема. Невозможно установить, какой из этих двух результатов DiplomaStudent, а какой – GraduateStudent. Для этого создадим дополнение к имени (studentType)  с указанием Diploma или Graduate. Таким образом, просто смотря на имена, можно определить, какой из них DiplomaStudent, а какой – GraduateStudent.

      Вернемся к проекту. Теперь стоит создать метод PrintName, который будет одинаковым для обоих производных классов, и добавить DiplomaStudent и GraduateStudent, чтоб сделать их более читабельными и понятными.

      class DiplomaStudent : Student {

             public void PrintName() {

                   Console.WriteLine(FirstName + " " + LastName + " - Diploma Student");

             }

      }

      class GraduateStudent : Student {

             public void PrintName() {

                   Console.WriteLine(FirstName + " " + LastName + " - Graduate Student");

             }

      }

      Как известно, тот же метод используется в базовом классе.

      class Student {

             public string FirstName;

             public string LastName;

             public void PrintName() {

                   Console.WriteLine(FirstName + " " + LastName);

             }

      }

      В результате дочерний класс скрывает реализацию базового класса.

      При построении кода появляется зеленая волнистая линия. Если навести курсор мыши на линию, можно увидеть объяснение: если нужно специально скрыть унаследованный член, используйте новое ключевое слово.

      Построение кода

      Чтобы скрыть унаследованный от производного класса член, используйте новое ключевое слово, например:

      class DiplomaStudent : Student {

             public new void PrintName() {

                   Console.WriteLine(FirstName + " " + LastName + " - Diploma Student");

             }

      }

      class GraduateStudent : Student {

             public new void PrintName() {

                   Console.WriteLine(FirstName + " " + LastName + " - Graduate Student");

             }

      }

      Запустите программу:

      Запуск программы

      Результат оправдал ожидания. Рассмотрим, как вызвать метод назад после скрытия. Существует несколько способов.

      Первый – использование основных ключевых слов.

      class DiplomaStudent : Student {

             public new void PrintName() {

                   base.PrintName();

             }

      }

      class GraduateStudent : Student {

             public new void PrintName() {

                   Console.WriteLine(FirstName + " " + LastName + " - Graduate Student");

             }

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

      Реализация базового класса

      Второй способ – превратить тип переменной дочернего класса в базовый класс.

      using System;

      namespace methodHidingInCSharp {

             class DiplomaStudent : Student {

                   public new void PrintName() {

                          Console.WriteLine(FirstName + " " + LastName + " - Diploma Student");

                   }

             }

             class GraduateStudent : Student {

                   public new void PrintName() {

                          Console.WriteLine(FirstName + " " + LastName + " - Graduate Student");

                   }

             }

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

      class Program {

             static void Main(string[] args) {

                   DiplomaStudent ds = new DiplomaStudent();

                   ds.FirstName = "Sam";

                   ds.LastName = "Fisher";

                   re I have type - casted the child class reference variable into a base class

                          ((Student)ds).PrintName();

                   GraduateStudent gs = new GraduateStudent();

                   gs.FirstName = "Aiden";

                   gs.LastName = "Pearce";

                   ((Student)gs).PrintName();

             }

      }

      Запустите программу. 

      Запуск программы

      В предыдущем результате Вы получили базовую реализацию.

      Третий способ состоит в создании переменной базового класса, которая указывает на дочерний класс.

      class Program {

             static void Main(string[] args) {

                   DiplomaStudent ds = new DiplomaStudent();

                   ds.FirstName = "Sam";

                   ds.LastName = "Fisher";

                   re I have type - casted the child class reference variable into a base class

                          ((Student)ds).PrintName();

                   GraduateStudent gs = new GraduateStudent();

                   gs.FirstName = "Aiden";

                   gs.LastName = "Pearce";

                   ((Student)gs).PrintName();

             }

      }

      Результат тот же.

      Результат программы

      Источник: http://www.c-sharpcorner.com/UploadFile/219d4d/method-hiding-in-C-Sharp/

      КОММЕНТАРИИ И ОБСУЖДЕНИЯ

      Пакеты подписки с доступом ко всем курсам и сервисам

      Стартовый
      • Все видеокурсы на 3 месяца
      • Тестирование по 10 курсам
      • Проверка 5 домашних заданий
      • Консультация с тренером 30 мин
      Базовый
      • Все видеокурсы на 6 месяцев
      • Тестирование по 16 курсам
      • Проверка 10 домашних заданий
      • Консультация с тренером 60 мин
      Премиум
      • Все видеокурсы на 1 год
      • Тестирование по 24 курсам
      • Проверка 20 домашних заданий
      • Консультация с тренером 120 мин
      new
      Премиум Plus
      • Все видеокурсы на 1 год
      • Тестирование по 24 курсам
      • Проверка 20 домашних заданий
      • Консультация с тренером 120 мин
      • Скачивание видео уроков
      Notification success
      Мы используем cookie-файлы, чтобы сделать взаимодействие с нашими веб-сайтами и услугами простым и значимым.