为做基类而生的基类和开放/关闭原则
有上节继承开始引导,上代码
public class Program { static void Main(string[] args) { Vehicle vehicle = new Car(); vehicle.Stopped(); } } public class Vehicle { public void Stopped() { Console.WriteLine("Stop it"); } } class Car : Vehicle { public void Run() { Console.WriteLine("B"); } } class RaceCar :Vehicle { public void Run() { Console.WriteLine("C"); } }
在代码中我们的vehicle实例只有stopped方法,而无法调用car里面的run方法,为了解决这个问题,我们有两种解决方案:
虚方法:
public class Program { static void Main(string[] args) { Vehicle vehicle = new Car(); vehicle.Run(); Vehicle vehicle_ = new RaceCar(); vehicle_.Run(); } } public class Vehicle { public void Stopped() { Console.WriteLine("Stop it"); } public virtual void Run() { Console.WriteLine("..."); } } class Car : Vehicle { public override void Run() { Console.WriteLine("B"); } } class RaceCar :Vehicle { public override void Run() { Console.WriteLine("C"); } }
在基类中添加虚方法,让子类去重写,可有效解决这个问题。
在Vehicle加方法:
public class Vehicle { public void Stopped() { Console.WriteLine("Stop it"); } public void Run(string typename) { if (typename=="Car") { Console.WriteLine("B"); } else if (typename == "RaceCar") { Console.WriteLine("C"); } } }
违反了开闭原则,我们更改的类是关闭的,这个方法不行。
在上面两个方法中,我们采用虚方法这个解决方案,但不难发现,在实际工作中,我们可能永远不会调用Vehicle里面的Run方法,所以我们可以给他变成纯虚方法,使用关键字abstract,相应的类也变成了抽象类。
public abstract class Vehicle { public void Stopped() { Console.WriteLine("Stop it"); } public abstract void Run(); }