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");
}
}
Наконец, имейте в виду, что вы по-прежнему можете обратиться к реализации скрытого члена из базового класса, используя явное приведение, как описано в следующем разделе. Вот пример:
...
// Здесь вызывается метод Draw, определенный в классе ThreeDCircle.
ThreeDCircle o = new ThreeDCircle;
o.Draw;
// Здесь вызывается метод Draw, определенный в родительском классе!
((Circle)o).Draw;
Console.ReadLine;
Правила приведения для базовых и производных классов
Теперь, когда вы умеете строить семейства взаимосвязанных типов классов, нужно изучить правила, которым подчиняются
Program (если вы прорабатываете примеры, тогда откройте проект Employees в Visual Studio). Как описано в последнем разделе настоящей главы, изначальным базовым классом в системе является System.Object. По указанной причине любой класс "является" Object и может трактоваться как таковой. Таким образом, внутри переменной типа object допускается хранить экземпляр любого типа:static void CastingExamples
{
// Manager "является" System.Object, поэтому в переменной
// типа object можно сохранять ссылку на Manager.
object frank = new Manager("Frank Zappa", 9, 3000, 40000, "111-11-1111", 5);
}
В проекте Employees
Manager, SalesPerson и PtSalesPerson расширяют класс Employee, а потому допустимая ссылка на базовый класс может хранить любой из объектов указанных классов. Следовательно, приведенный далее код также законен:Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT