C#笔记⑨——接口与反射,以及反射所衍生的SDK(坑未补)
一、一个接口对多个接口的继承
为了满足接口隔离原则,也为了以后好维护,将臃肿的接口拆分
点击查看代码
class Test
{
static void Main(string[] arg)
{
var driver=new Driver(new STank());
driver.UseDo();
}
}
class Driver
{
private IVehicle iVehicle;
public Driver(IVehicle _iVehicle)
{
iVehicle=_iVehicle;
}
public void UseDo()
{
iVehicle.Run();
}
}
interface IVehicle
{
void Run();
}
class Car:IVehicle
{
public void Run()
{
System.Console.WriteLine("Car is running");
}
}
class Trunck:IVehicle
{
public void Run()
{
System.Console.WriteLine("Trunck is running");
}
}
interface Weapon
{
void Fire();
}
interface ITank:IVehicle,Weapon
{
}
class STank:ITank
{
public void Fire()
{
System.Console.WriteLine("Boom!");
}
public void Run()
{
System.Console.WriteLine("ka ka ka");
}
}
class LTank:ITank
{
public void Fire()
{
System.Console.WriteLine("Boom!!!");
}
public void Run()
{
System.Console.WriteLine("Ka!!!");
}
}
二、反射
为什么要引入反射,当我们程序需要向外提供插件可能性时,必须以不变应万变,将插件提供者的方法规范化,即引入SDK,而SDK里面包含API这个接口,这个接口就是用来规范的。
反射虽好,但也会产生内耗,不可多用
点击查看代码
class Test
{
static void Main(string[] arg)
{
ITank tank=new LTank();
//==========================
var t=tank.GetType(); //获得动态类型
object o=Activator.CreateInstance(t); //激活器,反射,用动态类型创建对象
MethodInfo Mifire=t.GetMethod("Fire"); //利用反射机制调用
MethodInfo Mirun=t.GetMethod("Run");
Mifire.Invoke(o,null); //null是参数,有则填写
Mirun.Invoke(o,null);
}
}
class Driver
{
private IVehicle iVehicle;
public Driver(IVehicle _iVehicle)
{
iVehicle=_iVehicle;
}
public void UseDo()
{
iVehicle.Run();
}
}
interface IVehicle
{
void Run();
}
class Car:IVehicle
{
public void Run()
{
System.Console.WriteLine("Car is running");
}
}
class Trunck:IVehicle
{
public void Run()
{
System.Console.WriteLine("Trunck is running");
}
}
interface Weapon
{
void Fire();
}
interface ITank:IVehicle,Weapon
{
}
class STank:ITank
{
public void Fire()
{
System.Console.WriteLine("Boom!");
}
public void Run()
{
System.Console.WriteLine("ka ka ka");
}
}
class LTank:ITank
{
public void Fire()
{
System.Console.WriteLine("Boom!!!");
}
public void Run()
{
System.Console.WriteLine("Ka!!!");
}
}
利用封装好的反射,DependencyInjection,没有依赖反转(DIP),就没有依赖注入(DI)
点击查看代码
class Test
{
static void Main(string[] arg)
{
//以下为一次性注册,程序运行时就完成了
var sc=new ServiceCollection(); //实例化一个服务容器
//当接口实现对象改变时候,只需要改变第二值即可,改变业务快
sc.AddScoped(typeof(ITank),typeof(LTank)); //往里注册服务,接口的类是什么,什么类实现了这个接口
var sp=sc.BuildServiceProvider(); //构建服务对象
//=====================================以下为动态
ITank tank=sp.GetService<ITank>(); //提供服务
tank.Fire();
tank.Run();
}
}
class Driver
{
private IVehicle iVehicle;
public Driver(IVehicle _iVehicle)
{
iVehicle=_iVehicle;
}
public void UseDo()
{
iVehicle.Run();
}
}
interface IVehicle
{
void Run();
}
class Car:IVehicle
{
public void Run()
{
System.Console.WriteLine("Car is running");
}
}
class Trunck:IVehicle
{
public void Run()
{
System.Console.WriteLine("Trunck is running");
}
}
interface Weapon
{
void Fire();
}
interface ITank:IVehicle,Weapon
{
}
class STank:ITank
{
public void Fire()
{
System.Console.WriteLine("Boom!");
}
public void Run()
{
System.Console.WriteLine("ka ka ka");
}
}
class LTank:ITank
{
public void Fire()
{
System.Console.WriteLine("Boom!!!");
}
public void Run()
{
System.Console.WriteLine("Ka!!!");
}
}

浙公网安备 33010602011771号