依赖倒置原则--针对接口编程

案例:针对司机开汽车编写c#程序体现依赖倒置原则
常规思路
1.首先想到的是定义司机和汽车类,司机具有drive行为,即要在司机类里定义drive方法,汽车有run行为,即要在汽车类里定义run方法
2.考虑甲司机开宝马,乙司机开奔驰,所以首先想定义抽象类Car,然后宝马车和奔驰车继承并实现
实现:
public abstract class Car
    {
        public abstract void run();
    }
public class BMCar:Car
    {
        public override void run()
        {
            Console.WriteLine("baoma车启动");
        }
    }
 public class BCCar:Car
    {
        public override void run()
        {
            Console.WriteLine("奔驰车启动");
        }
    }
public class Driver
    {
        public void drive(Car car)
        {
            car.run();
        }
    }
  public static void Main(string[] args)
        {
            Driver xiong = new Driver();
            BMCar ba = new BMCar();
            xiong.drive(ba);
            Console.ReadKey();

            Driver Niu= new Driver();
            BCCar bc = new BCCar();
            Niu.drive(bc);
            Console.ReadKey();
        }
问题:1)宝马车不仅可以跑还可以飞了,那么在抽象类Car中添加fly不行,实现接口的类需要实现所有接口方法只好在BMCar类中添加fly功能。
            Driver xiong = new Driver();
            BMCar bm = new BMCar();
            xiong.drive(bm);
            bm.fly();
            Console.ReadKey();
         2)司机不仅可以驾驶汽车,还可以修汽车,发现Driver类要添加维修方法或将Driver弄成抽象类,像汽车那样处理。
         3)这样改动已经不小了,面对抽象编程而不是具体编程。
用接口实现:
  public interface IDriver
    {
       void drive(ICar car);
    }
 public class Driver:IDriver
    {
        public void drive(ICar car)  //尽管C#在定义接口时不用指明接口方法的访问控制方式,但默认接口方法均为public型,通常情况下,接口的实现方法也为public型
        {
            car.run();
        }
    }
public interface ICar
    {
       void run();
    }
 public class BMCar:ICar
    {
       public void run()
        {
            Console.WriteLine("开宝马车");
        }
    }
public class BCCar:ICar
    {
        public void run()
        {
            Console.WriteLine("开奔驰车");
        }
        public void fly()
        {
            Console.WriteLine("会飞了");
        }

    }
  public static void Main(string[] args)
        {
            IDriver Xiong = new Driver();
            ICar    BMW = new BMCar();
            Xiong.drive(BMW);
            Console.ReadKey();

            IDriver Niu = new Driver();
            BCCar BC = new BCCar();
            Niu.drive(BC);
            BC.fly();

            Console.ReadKey();
        }

      无论是什么语言,接口都是为了 解决扩展性的问题。往往我们不会去关心某个具体的类而只在乎他有没有去实现某个接口。 接口最大的特性可以在一类中实现多个接口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮特大熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值