Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 142
- Предыдущая
- 142/642
- Следующая
}// В классе Hexagon метод Draw() переопределяется.class Hexagon : Shape{ public Hexagon() {} public Hexagon(string name) : base(name){} public override void Draw() { Console.WriteLine("Drawing {0} the Hexagon", PetName); }}Полезность абстрактных методов становится совершенно ясной, как только вы снова вспомните, что подклассы никогда не обязаны переопределять виртуальные методы (как в случае
CircleHexagonCircleHexagonCircleConsole.WriteLine("***** Fun with Polymorphism *****\n");Hexagon hex = new Hexagon("Beth");hex.Draw();Circle cir = new Circle("Cindy");// Вызывает реализацию базового класса!cir.Draw();Console.ReadLine();Взгляните на вывод предыдущего кода:
***** Fun with Polymorphism *****Drawing Beth the HexagonInside Shape.Draw()Очевидно, что это не самое разумное проектное решение для текущей иерархии. Чтобы вынудить каждый дочерний класс переопределять метод
Draw()Shapeabstractabstract class Shape{ // Вынудить все дочерние классы определять способ своей визуализации. public abstract void Draw(); ...}На заметку! Абстрактные методы могут быть определены только в абстрактных классах, иначе возникнет ошибка на этапе компиляции.
Методы, помеченные как
abstracShapeDraw()С учетом сказанного метод
Draw()CircleCircleabstract// Если не реализовать здесь абстрактный метод Draw(), то Circle// также должен считаться абстрактным и быть помечен как abstract!class Circle : Shape{ public Circle() {} public Circle(string name) : base(name) {} public override void Draw() { Console.WriteLine("Drawing {0} the Circle", PetName); }}Итак, теперь можно предполагать, что любой класс, производный от
ShapeDraw()Console.WriteLine("***** Fun with Polymorphism *****\n");// Создать массив совместимых с Shape объектов.Shape[] myShapes = {new Hexagon(), new Circle(), new Hexagon("Mick"), new Circle("Beth"), new Hexagon("Linda")};// Пройти в цикле по всем элементам и взаимодействовать// с полиморфным интерфейсом.foreach (Shape s in myShapes){ s.Draw();}Console.ReadLine();Ниже показан вывод, выдаваемый этим кодом:
***** Fun with Polymorphism *****Drawing NoName the HexagonDrawing NoName the CircleDrawing Mick the HexagonDrawing Beth the CircleDrawing Linda the HexagonДанный код иллюстрирует полиморфизм в чистом виде. Хотя напрямую создавать экземпляры абстрактного базового класса (
ShapeShapeShapeShape- Предыдущая
- 142/642
- Следующая
