在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来说,新的子类方法覆盖了父类方法,使得即使对象转换回父类,也不再是父类的方法,而是子类先前覆盖后的方法。
字段的转换
对于子类转父类的字段变化,父类对象会把公共字段直接复制到新对象中