Язык программирования C#9 и платформа .NET5. Страница 170
{ return ip; } } return null;}Взаимодействовать с методом
FindFirstPointyShape()Console.WriteLine("***** Fun with Interfaces *****\n");// Создать массив элементов Shape.Shape[] myShapes = { new Hexagon(), new Circle(), new Triangle("Joe"), new Circle("JoJo")};<b>// Получитгь первый элемент, имеющий вершины.</b>IPointy firstPointyItem = FindFirstPointyShape(myShapes);// В целях безопасности использовать null-условную операцию.Console.WriteLine("The item has {0} points", firstPointyItem?.Points);Массивы интерфейсных типов
Вспомните, что один интерфейс может быть реализован множеством типов, даже если они не находятся внутри той же самой иерархии классов и не имеют общего родительского класса помимо
System.ObjectKnifeForkPitchFork
// Fork.csnamespace CustomInterfaces{ class Fork : IPointy { public byte Points => 4; }}// PitchFork.csnamespace CustomInterfaces{ class PitchFork : IPointy { public byte Points => 3; }}// Knife.cs.csnamespace CustomInterfaces{ class Knife : IPointy { public byte Points => 1; }}После определения типов
PitchForkForkKnifeIPointyIPointy...<b>// Этот массив может содержать только типы,</b><b>// которые реализуют интерфейс IPointy.</b>IPointy[] myPointyObjects = {new Hexagon(), new Knife(), new Triangle(), new Fork(), new PitchFork()};foreach(IPointy i in myPointyObjects){ Console.WriteLine("Object has {0} points.", i.Points);}Console.ReadLine();Просто чтобы подчеркнуть важность продемонстрированного примера, запомните, что массив заданного интерфейсного типа может содержать элементы любых классов или структур, реализующих этот интерфейс.
Автоматическая реализация интерфейсов
Хотя программирование на основе интерфейсов является мощным приемом, реализация интерфейсов может быть сопряжена с довольно большим объемом клавиатурного ввода. Учитывая, что интерфейсы являются именованными наборами абстрактных членов, для каждого метода интерфейса в каждом типе, который поддерживает данное поведение, потребуется вводить определение и реализацию. Следовательно, если вы хотите поддерживать интерфейс, который определяет пять методов и три свойства, тогда придется принять во внимание все восемь членов (иначе возникнут ошибки на этапе компиляции).
К счастью, в Visual Studio и Visual Studio Code поддерживаются разнообразные инструменты, упрощающие задачу реализации интерфейсов. В качестве примера вставьте в текущий проект еще один класс по имени
PointyTestClassIPointy

Обратите внимание, что в списке предлагаются два пункта, из которых второй (явная реализация интерфейса) обсуждается в следующем разделе. Для начала выберите первый пункт. Среда Visual Studio/Visual Studio Code сгенерирует код заглушки, подлежащий обновлению (как видите, стандартная реализация генерирует исключение
System.NotImplementedExceptionnamespace CustomInterfaces{ class PointyTestClass : IPointy