Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 166
- Предыдущая
- 166/642
- Следующая
В интерфейсах в C# 8 нельзя определять поля данных или нестатические конструкторы. Таким образом, следующая версия интерфейса
IPointy
<b>// Внимание! В этом коде полно ошибок!</b>
public interface IPointy
{
// Ошибка! Интерфейсы не могут иметь поля данных!
public int numbOfPoints;
// Ошибка! Интерфейсы не могут иметь нестатические конструкторы!
public IPointy() { numbOfPoints = 0;}
}
В начальной версии интерфейса
IPointy
IPointy
Points
GetNumberOfPoints()
// Поведение "наличия вершин" в виде свойства только для чтения.
public interface IPointy
{
// Неявно public и abstract.
// byte GetNumberOfPoints();
// Свойство, поддерживающее чтение и запись,
// в интерфейсе может выглядеть так:
// string PropName { get; set; }
// Тогда как свойство только для записи - так:
byte Points { get; }
}
На заметку! Интерфейсные типы также могут содержать определения событий (глава 12) и индексаторов (глава 11).
Сами по себе интерфейсные типы совершенно бесполезны, поскольку выделять память для них, как делалось бы для класса или структуры, невозможно:
// Внимание! Выделять память для интерфейсных типов не допускается!
IPointy p = new IPointy(); // Ошибка на этапе компиляции!
Интерфейсы не привносят ничего особого до тех пор, пока не будут реализованы классом или структурой. Здесь
IPointy
Hexagon
Circle
Реализация интерфейса
Когда функциональность класса (или структуры) решено расширить за счет поддержки интерфейсов, к определению добавляется список нужных интерфейсов, разделенных запятыми. Имейте в виду, что непосредственный базовый класс должен быть указан первым сразу после операции двоеточия. Если тип класса порождается напрямую от
System.Object
System.Object
System.ValueType
// Этот класс является производными от System.Object
// и реализует единственный интерфейс.
public class Pencil : IPointy
{...}
// Этот класс также является производными от System.Object
// и реализует единственный интерфейс.
public class SwitchBlade : object, IPointy
{...}
// Этот класс является производными от специального базового
// класса и реализует единственный интерфейс.
public class Fork : Utensil, IPointy
{...}
// Эта структура неявно является производной
// от System.ValueType и реализует два интерфейса.
public struct PitchFork : ICloneable, IPointy
{...}
Важно понимать, что для интерфейсных элементов, которые не содержат стандартной реализации, реализация интерфейса работает по плану "все или ничего". Поддерживающий тип не имеет возможности выборочно решать, какие члены он будет реализовывать. Учитывая, что интерфейс
IPointy
IDbConnection
В текущем примере добавьте к проекту новый тип класса по имени
Triangle
Shape
IPointy
Points
using System;
namespace CustomInterfaces
{
// Новый класс по имени Triangle, производный от Shape.
class Triangle : Shape, IPointy
{
public Triangle() { }
public Triangle(string name) : base(name) { }
public override void Draw()
{
Console.WriteLine("Drawing {0} the Triangle", PetName);
}
<b> // Реализация IPointy.</b>
- Предыдущая
- 166/642
- Следующая