Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 170
- Предыдущая
- 170/642
- Следующая
{
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.Object
Knife
Fork
PitchFork

// Fork.cs
namespace CustomInterfaces
{
class Fork : IPointy
{
public byte Points => 4;
}
}
// PitchFork.cs
namespace CustomInterfaces
{
class PitchFork : IPointy
{
public byte Points => 3;
}
}
// Knife.cs.cs
namespace CustomInterfaces
{
class Knife : IPointy
{
public byte Points => 1;
}
}
После определения типов
PitchFork
Fork
Knife
IPointy
IPointy
...
<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 поддерживаются разнообразные инструменты, упрощающие задачу реализации интерфейсов. В качестве примера вставьте в текущий проект еще один класс по имени
PointyTestClass
IPointy


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