Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 143
- Предыдущая
- 143/642
- Следующая
С учетом того, что все элементы в массиве
myShapes
Shape
Draw()
Shape
Draw()
Такой прием также делает простым безопасное расширение текущей иерархии. Например, пусть вы унаследовали от абстрактного базового класса
Shape
Triangle
Square
foreach
myShapes
Shape
Сокрытие членов
Язык C# предоставляет возможность, которая логически противоположна переопределению методов и называется сокрытием. Выражаясь формально, если производный класс определяет член, который идентичен члену, определенному в базовом классе, то производный класс скрывает версию члена из родительского класса. В реальном мире такая ситуация чаще всего возникает, когда вы создаете подкласс от класса, который разрабатывали не вы (или ваша команда); например, такой класс может входить в состав программного пакета, приобретенного у стороннего поставщика.
В целях иллюстрации предположим, что вы получили от коллеги на доработку класс по имени
ThreeDCircle
Draw()
class ThreeDCircle
{
public void Draw()
{
Console.WriteLine("Drawing a 3D Circle");
}
}
Вы полагаете, что
ThreeDCircle
Circle
Circle
class ThreeDCircle : Circle
{
public void Draw()
{
Console.WriteLine("Drawing a 3D Circle");
}
}
После перекомпиляции вы обнаружите следующее предупреждение:
'ThreeDCircle.Draw()' hides inherited member 'Circle.Draw()'. To make
the current member
override that implementation, add the override keyword.
Otherwise add the new keyword.
'Shapes.ThreeDCircle.Draw()
Shapes.Circle.Draw()
Чтобы текущий член переопределял эту реализацию, добавьте ключевое слово override
В противном случае добавьте ключевое слово new
Дело в том, что у вас есть производный класс (
ThreeDCircle
Draw()
override
ThreeDCircle
Draw()
В качестве альтернативы вы можете добавить ключевое слово
new
Draw()
ThreeDCircle
// Этот класс расширяет Circle и скрывает унаследованный метод Draw().
class ThreeDCircle : Circle
{
// Скрыть любую реализацию Draw(), находящуюся выше в иерархии.
public new void Draw()
{
Console.WriteLine("Drawing a 3D Circle");
}
}
Вы можете также применить ключевое слово
new
ThreeDCircle
PetName
class ThreeDCircle : Circle
{
// Скрыть свойство PetName, определенное выше в иерархии.
public new string PetName { get; set; }
// Скрыть любую реализацию Draw(), находящуюся выше в иерархии.
public new void Draw()
{
Console.WriteLine("Drawing a 3D Circle");
}
}
Наконец, имейте в виду, что вы по-прежнему можете обратиться к реализации скрытого члена из базового класса, используя явное приведение, как описано в следующем разделе. Вот пример:
- Предыдущая
- 143/642
- Следующая