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

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

Подписка

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

advertisement advertisement

Введение

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


Создадим в 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/

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

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

Библиотека современных IT знаний в удобном формате

Выбирай свой вариант подписки в зависимости от задач, стоящих перед тобой. Но если нужно пройти полное обучение с нуля до уровня специалиста, то лучше выбирать Базовый или Премиум. А для того чтобы изучить 2-3 новые технологии, или повторить знания, готовясь к собеседованию, подойдет Пакет Стартовый.

Стартовый
  • Все видеокурсы на 3 месяца
  • Тестирование по 10 курсам
  • Проверка 5 домашних заданий
  • Консультация с тренером 30 мин
59.99 $
Оформить подписку
Пакет Black Friday
  • Все видеокурсы на 15 месяцев
  • Тестирование по 24 курсам
  • Проверка 20 домашних заданий
  • Консультация с тренером 120 мин
  • Скачивание видео уроков
  • Возможность приостановки обучения
110.00 $
220.00 $
Оформить подписку
Акция
Базовый
  • Все видеокурсы на 1 год
  • Тестирование по 16 курсам
  • Проверка 10 домашних заданий
  • Консультация с тренером 60 мин
89.99 $
Оформить подписку
Notification success