C#语法篇 :基类子类转换,成员变化情况
在C#中,会有从子类对象到基类对象的转换,这属于C#中的向上扩容,一般可以默认转换。
方法的转换
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ex3._4
{class Father{public void F(){Console.WriteLine("A.F");}public virtual void G(){Console.WriteLine("A.G");}}class Son : Father{new public void F() { Console.WriteLine("B.F"); }public override void G(){Console.WriteLine("B.G");}}internal class Program{static void Main(string[] args){Son b = new Son();Father a = b; a.F(); b.F();a.G();b.G();}}}
对于上面这段程序,输出结果是这样的
其中b子类对象的输出当然都是正常的,而a父类的两个方法出现了歧义:a.F输出了a.F,a.G输出了b.G,这是因为对于new关键词来说,他没有彻底覆盖父类的方法,而只是定义了一种新的同名方法;对于virtual-override来说,新的子类方法覆盖了父类方法,使得即使对象转换回父类,也不再是父类的方法,而是子类先前覆盖后的方法。
字段的转换
对于子类转父类的字段变化,父类对象会把公共字段直接复制到新对象中