C#面向对象:接口

118 阅读2分钟

接口

什么是接口

接口与抽象类类似,仅作声明不做具体实现

接口的声明需要用interface关键字,接口名称前需要加大写I表示接口,接口内声明的方法全是public

public interface ICalculator{
 int Calculate();
}

接口的作用

解耦,使系统间的耦合降到最小

image.png

反转控制与依赖注入

由IOC容器在运行期间动态的将某种依赖关系注入到某个对象中

举个例子:电脑的usb接口和usb设备:电脑无法决定usb上连接什么设备,只能读取usb接口,故符合usb接口的设备都可被使用,需要什么设备由人(IOC容器)控制,usb设备在插入电脑前没有任何关系,只有插入后才产生关系,且一方的问题不影响另一方的运行。

using Microsoft.Extensions.DependencyInjection;

ServiceCollection services = new ServiceCollection();
//ioc容器通过接口对服务(添加进入ioc容器的代码)进行识别
//通过在泛型中定义订单处理接口,指定订单处理服务的具体实现代码
services.AddScoped<IOrderProcessor,OrderPocessor>();
services.AddScoped<IShippingCalculator,ShippingCalculator>();
//ioc容器全权管理两个服务的生命周期
//此时已经不需要手动创建实例了,ioc自动分析两个服务的依赖关系,自动处理两个服务的处理时机

向ioc容器添加服务的方法:

singleton 单例模式:整个程序的生命周期内只会创建唯一的一个实例

scoped 作用域模式:ioc在一个作用域(比如后端处理一个http请求的过程就相当于一个作用域)的范围内创建唯一的一个实例

tansient 瞬时模式:每一次调用服务时都会创建一个新的实例对象,服务结束后ioc也会自动收回内存,删除实例(一次性的服务)

//从ioc提取服务
IServiceProvider serviceProvider = service.BuildServiceProvider();
//通过serviceProvider提取IOrderProcessor服务,调用服务需要使用接口
var orderProcess = serviceProvider.GetService<IOrderProcessor>();
//处理订单
orderProcess。Process(order)

多态

多重继承与多重实现

首先,C#不存在多重继承

但是我们可以在类中实现多个接口,继承时,基类的代码会被继承,但是对于接口来说,方法只有签名没有实现,不存在代码复用

通过接口,实现多态

不同的类继承同一个接口,用不同的代码实现同一个的方法。通过一个接口的list将其进行整合,最终实现多态的目的 event事件和delegate委托都能实现同样的功能