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