1. 什么是C#接口?
C#接口是一种定义了一组方法、属性和事件,但不包含实现的类型。接口定义了一组合约,表示实现该接口的任何类型都必须提供一些特定的属性、方法和事件。接口可以是公共的或私有的,并且可以被其他类型实现。
接口可以被视为“协议”,因为它们定义了类型之间的合作模式。
interface IPrinter
{
void Print();
}
上面的代码定义了一个接口IPrinter,该接口定义了一个Print方法。实现该接口的任何类型都必须包含一个Print方法。
2. 接口的优点
2.1 多态性
接口可以实现多态性,这意味着一个对象可以使用多种类型。
public interface IMessage
{
void Send();
}
public class EmailMessage : IMessage
{
public void Send()
{
// 发送电子邮件
}
}
public class SMSMessage : IMessage
{
public void Send()
{
// 发送短信
}
}
上面的代码定义了一个IMessage接口和两个实现了该接口的类:EmailMessage和SMSMessage。使用IMessage,我们可以使用不同种类的消息对象,而不需要关心具体的实现细节。
2.2 代码复用
接口可以促进代码复用。当多个类需要共享一些功能时,可以定义一个共同的接口,并实现该接口。
public interface IDataAccess
{
void SaveData(string data);
string LoadData();
}
public class FileDataAccess : IDataAccess
{
public void SaveData(string data)
{
// 使用文件系统保存数据
}
public string LoadData()
{
// 从文件系统加载数据
}
}
public class DatabaseDataAccess : IDataAccess
{
public void SaveData(string data)
{
// 使用数据库保存数据
}
public string LoadData()
{
// 从数据库加载数据
}
}
上面的代码定义了一个IDataAccess接口和两个实现了该接口的类:FileDataAccess和DatabaseDataAccess。这两个类共享了相同的保存和加载数据的功能,但使用了不同的技术来实现。
2.3 代码模块化
接口支持代码模块化,这意味着类可以按照需要实现不同的接口。
public interface IShape
{
int GetArea();
}
public class Rectangle : IShape
{
public int GetArea()
{
return 10 * 5;
}
}
public class Circle : IShape
{
const double Pi = 3.14159;
private readonly int _radius;
public Circle(int radius)
{
_radius = radius;
}
public int GetArea()
{
return (int)(Pi * _radius * _radius);
}
}
上面的代码定义了一个IShape接口和两个实现了该接口的类:Rectangle和Circle。这两个类提供了不同形状的GetArea方法实现。这使得不同形状的对象可以使用相同的逻辑,而不需要重新实现它。
3. 总结
C#接口是一种非常有用的类型,它可以提供多态性、代码复用和代码模块化。接口可以被视为协议,因为它们定义了类型之间的合作模式。