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!!!");
        }

    }


posted @ 2022-02-07 17:12  Ariaaaaa  阅读(6)  评论(0)    收藏  举报