Язык программирования C#9 и платформа .NET5. Страница 168
}Console.ReadLine();Обратите внимание, что когда применяется ключевое слово
astry/catchnullПолучение ссылок на интерфейсы: ключевое слово is (обновление в версии 7.0)
Проверить, реализован ли нужный интерфейс, можно также с помощью ключевого слова
isfalseConsole.WriteLine("***** Fun with Interfaces *****\n");...if(hex2 is IPointy itfPt3){ Console.WriteLine("Points: {0}", itfPt3.Points);}else{ Console.WriteLine("OOPS! Not pointy...");} Console.ReadLine();Стандартные реализации (нововведение в версии 8.0)
Как упоминалось ранее, в версии C# 8.0 методы и свойства интерфейса могут иметь стандартные реализации. Добавьте к проекту новый интерфейс по имени
IRegularPointynamespace CustomInterfaces{ interface IRegularPointy : IPointy { int SideLength { get; set; } int NumberOfSides { get; set; } int Perimeter => SideLength * NumberOfSides; }}Добавьте к проекту новый файл класса по имени
Square.csShapeIRegularPointynamespace CustomInterfaces{ class Square: Shape,IRegularPointy { public Square() { } public Square(string name) : base(name) { } // Метод Draw() поступает из базового класса Shape public override void Draw() { Console.WriteLine("Drawing a square"); } // Это свойство поступает из интерфейса IPointy public byte Points => 4; // Это свойство поступает из интерфейса IRegularPointy. public int SideLength { get; set; } public int NumberOfSides { get; set; } // Обратите внимание, что свойство Perimeter не реализовано. }}Здесь мы невольно попали в первую "ловушку", связанную с использованием стандартных реализаций интерфейсов. Свойство
PerimeterIRegularPointySquareSquareSquareConsole.WriteLine("\n***** Fun with Interfaces *****\n");...var sq = new Square("Boxy") {NumberOfSides = 4, SideLength = 4};sq.Draw();// Следующий код не скомпилируется:// Console.WriteLine($"{sq.PetName} has {sq.NumberOfSides} of length{sq.SideLength} and a perimeter of {sq.Perimeter}");Взамен экземпляр
SquareIRegularPointyPerimeterConsole.WriteLine($"{sq.PetName} has {sq.NumberOfSides} of length {sq.SideLength} and a perimeter of {((IRegularPointy)sq).Perimeter}");Один из способов обхода этой проблемы — всегда указывать интерфейс типа. Измените определение экземпляра
SquareSquareIRegularPointyIRegularPointy sq = new Square("Boxy") {NumberOfSides = 4, SideLength = 4};Проблема с таким подходом (в данном случае) связана с тем, что метод
Draw()PetNameХотя пример тривиален, он демонстрирует одну из проблем, касающихся стандартных реализаций. Прежде чем задействовать это средство в своем коде, обязательно оцените последствия того, что вызывающему коду должно быть известно, где находятся реализации.
Статические конструкторы и члены (нововведение в версии 8.0)
Еще одним дополнением интерфейсов в C# 8.0 является возможность наличия в них статических конструкторов и членов, которые функционируют аналогично статическим членам в определениях классов, но определены в интерфейсах. Добавьте к интерфейсу
IRegularPointy