Введение
В данной статье Вы узнаете, как скрывать метод и как вызывать скрытые элементы базового класса. Рассмотрим это на конкретных примерах.
Создадим в 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/
Статті за схожою тематикою