案例:针对司机开汽车编写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(); }
无论是什么语言,接口都是为了 解决扩展性的问题。往往我们不会去关心某个具体的类而只在乎他有没有去实现某个接口。 接口最大的特性可以在一类中实现多个接口。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|