对象的继承关系是在编译的时候就定义好的,所以无法在运行时改变从父类集成的实现。子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当你需要复用子类的时候,如果继承下来的实现并不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。
组合优于继承的体现
abstract class Handsetsoft { public abstract void Run(); } class HandsetAddressList : Handsetsoft { public override void Run() { Console.WriteLine("运行手机通信录"); } } class HandsetGame : Handsetsoft { public override void Run() { Console.WriteLine("手机能够运行游戏"); } } //使用桥接模式,将原本所应继承的Handsetsoft接口,通过组合的方式引入进来,这样当接口中的内容发生变化的时候,就不需要更改所有实现接口的子类。 //这也就是为什么书中并没有使用接口而是使用抽象类来定义接口,因为这样就无法让新生成的手机品牌(HandsetBrandN)既能继承HandsetBrand,同时还能继承Handsetsoft。 abstract class HandsetBrand { protected Handsetsoft soft; //设置手机软件 public void SetHandsetSoft(Handsetsoft soft) { this.soft = soft; } public abstract void Run(); } //使用桥接模 class HandsetBrandN : HandsetBrand { public override void Run() { soft.Run(); } } //使用继承的方式 class HandsetBrandM : Handsetsoft, HandsetBrand { //todo……继承并实现接口中的内容。 //当接口中的功能新增的时候,那么以前写好的代码,都要去实现新增的接口,当类多的时候,就会很麻烦。 } class Program { static void Main(string[] args) { HandsetBrand ab = new HandsetBrandN(); ab.SetHandsetSoft(new HandsetGame()); ab.Run(); ab.SetHandsetSoft(new HandsetAddressList()); ab.Run(); } }