接口隔离原则

时间秒杀一切 提交于 2019-11-30 17:54:39

我们假设一个人会开汽车卡车坦克(但是不会开炮),我们先设置以下类
Vehicle类型

    interface IVehicle
    {
        void Run();
    }

    class Car:IVehicle
    {
        public void Run()
        {
            Console.WriteLine("Car is Running");
        }
    }
    class Truck:IVehicle
    {
        public void Run()
        {
            Console.WriteLine("Truck is Running");
        }
    }

Tank类型

    interface ITank
    {
        void Fire();
        void Run();
    }

    class Type99 : ITank
    {
        public void Fire()
        {
            Console.WriteLine("Boom!");
        }
        public void Run()
        {
            Console.WriteLine("Ka!");
        }
    }

这时候我们如果要人开Vehicle类的Car或者Truck,那么这个人就不能开Tank。

    class Driver
    {
        private IVehicle _vehicle;
        public Driver(IVehicle vehicle)
        {
            _vehicle = vehicle;
        }
        public void Drive()
        {
            _vehicle.Run();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var driver = new Driver(new Car());
            driver.Drive();
        }
    }

如果让他开Tank,则他不能开Vehicle

    class Driver
    {
        private ITank _tank;
        public Driver(ITank tank)
        {
            _tank = tank;
        }
        public void Drive()
        {
            _tank.Run();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var driver = new Driver(new Type99());
            driver.Drive();
        }
    }

仔细看会发现,Tank里面有作为Vehicle的Run()方法,和不属于Vehicle的Fire()方法。这使得Tank这个接口太大无法用Vehicle来囊括。
解决方式是把Tank这个接口拆分成两个接口,
分别是作为交通工具的IVehicle和作为武器的IWeapon。

ITank接口去继承这两个接口,它就是简单的把这两个接口结合起来,这就是一个接口对其他多个接口的继承。
C#中当类和类继承时,只允许存在一个父类(基类),但是当你拿一个类/接口去继承接口的时候,可以有多个父接口(基接口)

    interface IVehicle
    {
        void Run();
    }
    interface IWeapon
    {
        void Fire();
    }

    interface ITank:IVehicle,IWeapon
    {
    }

    class Type99 : ITank
    {
        public void Fire()
        {
            Console.WriteLine("Boom!");
        }
        public void Run()
        {
            Console.WriteLine("Ka!");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var drivercar = new Driver(new Car());
            drivercar.Drive();
            var drivertruck = new Driver(new Car());
            drivertruck.Drive();
            var drivertank = new Driver(new Type99());
            drivertank.Drive();
        }
    }

这样就Car,Truck,Tank都可以开了

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!