面向接口编程就是将对象中的某个功能提取出来作为接口,而功能的具体实现则交由继承自这个接口的实现类处理。
面向接口的好处是降低程序的耦合性,当有新的功能时只需要对新功能进行编写,不需要修改已有的代码
下面是一个简单的范例:
1 1 //父类 2 2 public class Duck 3 3 { 4 4 protected IFlyBehaviour flyBehaviour; 5 5 //可以动态修改对象的某一功能的实现 6 6 public void SetDuckFly(IFlyBehaviour fb) 7 7 { 8 8 flyBehaviour = fb; 9 9 } 1010 public void DuckFly() 1111 { 1212 flyBehaviour.Fly(); 1313 } 1414 } 1515 1616 //小鸭子类,继承鸭子类 1717 public class LittleDuck : Duck 1818 { 1919 public LittleDuck() 2020 { 2121 flyBehaviour = new SlowFly(); 2222 } 2323 } 2424 2525 //大鸭子类,继承鸭子类 2626 public class BigDuck : Duck 2727 { 2828 public BigDuck() 2929 { 3030 flyBehaviour = new QuickFly(); 3131 } 3232 } 3333 3434 //飞行为的接口,只定义了飞行的方法而未实现 3535 public interface IFlyBehaviour 3636 { 3737 void Fly(); 3838 } 3939 4040 //实现快速飞的行为类,继承了飞行接口 4141 public class QuickFly : IFlyBehaviour 4242 { 4343 public void Fly() 4444 { 4545 Console.WriteLine("飞行速度非常快"); 4646 } 4747 } 4848 4949 //实现慢速飞行的行为类,继承了飞行接口 5050 public class SlowFly : IFlyBehaviour 5151 { 5252 public void Fly() 5353 { 5454 Console.WriteLine("飞行速度非常慢"); 5555 } 5656 }
假设作为父类的鸭子类Duck具有飞行的功能,继承自它的两个子类大鸭子BigDuck飞得快,小鸭子LittleDuck飞的慢,通过面向接口的方式进行实现,而通过父类Duck中的SetDuckFly()方法,我们还可以在程序运行过程中动态的去修改某一功能
执行:
11 BigDuck bigDuck = new BigDuck(); 22 bigDuck.DuckFly(); 33 44 LittleDuck littleDuck = new LittleDuck(); 55 littleDuck.DuckFly(); 66 77 littleDuck.SetDuckFly(new QuickFly()); 88 littleDuck.DuckFly();
结果:
11 飞行速度非常快 22 飞行速度非常慢 33 飞行速度非常快