namespace Protected { class Program { static void Main(string[] args) { Parent p = new Child(); Console.WriteLine(p.X); Console.WriteLine(p.test()); Console.WriteLine(p.test1()); Console.ReadLine(); } } public class Parent { public Parent() { Add(2); } public int X = 10; protected int Add(int y) { return X += y; } public virtual int test() { return 0; } public int test1() { return 0; } } public class Child : Parent { public int X = 9; public override int test() { return 15; } public int test1() { return 15; } } }
输出依次为12、15、0 可以看到
Parent p = new Child();
这里其实调用的是父类的X,也就是声明了一个孩子的人类对象。
这样做的好处是,比如有个计算器的基类,现在有一个加法运算类,如果以后再次扩展,只需加一个减法的运算类继承基类、然后直接 基类 a=new 减法类() 就可以了,不需要改变基类中的代码。
直观的解释:
对外接口可能只是父类,这样可以方便你在内部扩展子类,比方说你又增加了一个子类,外面接口不用改变
这就好比,你学习计算机学习的是面向通用的计算机的知识,学好以后,你去具体使用计算机,那么使用的是某个品牌某个型号的计算机,但是你不用关心它具体怎么实现的,你用通用的知识就可以驾驭它。
关于后两个值的解释:
另外需要注意ovrride,如果子类中不重写父类的方法test,那么调用的是父类的方法。