Язык программирования C#9 и платформа .NET5. Страница 173
using System;using InterfaceHierarchy;Console.WriteLine("***** Simple Interface Hierarchy *****");<b>// Вызвать на уровне объекта.</b>BitmapImage myBitmap = new BitmapImage();myBitmap.Draw();myBitmap.DrawInBoundingBox(10, 10, 100, 150);myBitmap.DrawUpsideDown();<b>// Получить IAdvancedDraw явным образом.</b>if (myBitmap is IAdvancedDraw iAdvDraw){ iAdvDraw.DrawUpsideDown();}Console.ReadLine();Иерархии интерфейсов со стандартными реализациями (нововведение в версии 8.0)
Когда иерархии интерфейсов также включают стандартные реализации, то нижерасположенные интерфейсы могут задействовать реализацию из базового интерфейса или создать новую стандартную реализацию. Модифицируйте интерфейс
IDrawablepublic interface IDrawable{ void Draw(); int TimeToDraw() => 5;}Теперь обновите операторы верхнего уровня:
Console.WriteLine("***** Simple Interface Hierarchy *****");...if (myBitmap is IAdvancedDraw iAdvDraw){ iAdvDraw.DrawUpsideDown(); Console.WriteLine($"Time to draw: {iAdvDraw.TimeToDraw()}");}Console.ReadLine();Этот код не только скомпилируется, но и выведет значение
5TimeToDraw()BitMapImageIAdvancedDrawTimeToDraw()BitMapImage// Этот код не скомпилируетсяmyBitmap.TimeToDraw();Если в нижерасположенном интерфейсе желательно предоставить собственную стандартную реализацию, тогда потребуется скрыть вышерасположенную реализацию. Например, если вычерчивание в методе
TimeToDraw()IAdvancedDrawpublic interface IAdvancedDraw : IDrawable{ void DrawInBoundingBox( int top, int left, int bottom, int right); void DrawUpsideDown();<b> new int TimeToDraw() => 15;</b>}Разумеется, в классе
BitMapImageTimeToDraw()TimeToDraw()IAdvancedDrawpublic class BitmapImage : IAdvancedDraw{... public int TimeToDraw() => 12;}В случае приведения экземпляра
BitmapImageIAdvancedDrawIDrawable// Всегда вызывается метод на экземпляре:Console.WriteLine("***** Calling Implemented TimeToDraw *****");Console.WriteLine($"Time to draw: {myBitmap.TimeToDraw()}");Console.WriteLine($"Time to draw: {((IDrawable) myBitmap).TimeToDraw()}");Console.WriteLine($"Time to draw: {((IAdvancedDraw) myBitmap).TimeToDraw()}");Вот результаты:
***** Simple Interface Hierarchy *****...***** Calling Implemented TimeToDraw *****Time to draw: 12Time to draw: 12Time to draw: 12Множественное наследование с помощью интерфейсных типов
В отличие от типов классов интерфейс может расширять множество базовых интерфейсов, что позволяет проектировать мощные и гибкие абстракции. Создайте новый проект консольного приложения по имени
MiInterfaceHierarchyIShapeIDrawableIPrintable// IDrawable.csnamespace MiInterfaceHierarchy{ // Множественное наследование для интерфейсных типов - это нормально. interface IDrawable {