Интерфейсы в C# представляют собой контракты, которые определяют набор методов и свойств, которые должны быть реализованы классами, которые реализуют эти интерфейсы. Интерфейсы определяют поведение, которое классы должны предоставить, но не определяют их реализацию. Это позволяет достичь абстракции и разделения интерфейса и реализации.
Основные особенности интерфейсов:
1. Интерфейсы определяют только сигнатуры методов (без реализации) и свойств (с геттерами и/или сеттерами).
2. Классы, реализующие интерфейсы, обязаны предоставить реализацию всех методов и свойств, определенных в интерфейсе.
3. Классы могут реализовывать несколько интерфейсов одновременно, путем разделения их имен запятой.
4. Интерфейсы обеспечивают гибкость в проектировании программ, позволяя создавать классы, которые могут взаимодействовать через общие интерфейсы, не завися от конкретных реализаций.
5. Интерфейсы также могут использоваться для реализации полиморфизма, когда объекты различных классов могут быть использованы через общий интерфейс.
Пример интерфейса:
“`csharp
interface IShape
{
double CalculateArea();
void DisplayShape();
}
class Circle : IShape
{
private double radius;
public Circle(double radius)
{
this.radius = radius;
}
public double CalculateArea()
{
return Math.PI * radius * radius;
}
public void DisplayShape()
{
Console.WriteLine($”Circle with radius {radius}”);
}
}
class Rectangle : IShape
{
private double width;
private double height;
public Rectangle(double width, double height)
{
this.width = width;
this.height = height;
}
public double CalculateArea()
{
return width * height;
}
public void DisplayShape()
{
Console.WriteLine($”Rectangle with width {width} and height {height}”);
}
}
class Program
{
static void Main()
{
IShape circle = new Circle(5);
IShape rectangle = new Rectangle(4, 6);
circle.DisplayShape();
Console.WriteLine($”Area: {circle.CalculateArea()}”);
rectangle.DisplayShape();
Console.WriteLine($”Area: {rectangle.CalculateArea()}”);
Console.WriteLine(“Нажмите любую клавишу для выхода…”);
Console.ReadKey();
}
}
“`
В приведенном примере у нас есть интерфейс `IShape`, который определяет два метода: `CalculateArea()` и `DisplayShape()`. Затем у нас есть два класса `Circle` и `Rectangle`, которые реализуют этот интерфейс, предоставляя свои собственные реализации для методов интерфейса.
В методе `Main` мы создаем объекты `Circle` и `Rectangle`, но присваиваем их переменным типа `IShape`. Это позволяет нам вызывать методы интерфейса для объектов, не заботясь о конкретных типах классов. Это демонстрирует гибкость и полиморфизм, предоставляемые интерфейсами.
Интерфейсы являются мощным инструментом в объектно-ориентированном программировании, позволяя создавать чистый код, легко поддерживаемый и расширяемый.