“重写”:允许使用现有成员的一个新实现代替基础类实现。换句话说就是允许使用自己的实现代替相
同名称的一个基类成员。
“隐藏”:可以模糊一个基类的成员并用一个完全不同的新实现代替它。
“重写”:在基类中要被重写的方法要修饰为virtual,在子类中该方法要被修饰为overrride。
新实现的方法必须与要被重写的方法有相同的函数名,函数签名,返回类型以及
访问级别。(简单来说就是除了virtual/override,其他函数声明完全一致)
“隐藏”:子类中的方法要被修饰为new
子类中的方法与要被隐藏的方法有相同的函数签名并且是相同种类的成
员,但是它可以拥有不同的访问级别,返回类型以及函数实现 。
“重载”:一个重载的方法必须拥有于先前存在的方法有相同函数名字,而且必须拥有不同
的函数签名,至于返回类型和访问级别可以相同也可以不同
任何拥有于先前存在的方法相同的函数名,不同色调签名方法,都将被看做是那个方法的一个重载并且不会隐藏先前存在的方法
如果一个继承类被强制转换为的他的一个基类并且一个重写的方法被调用:
if 新的方法是重写的,则对象的类型决定那个方法被调用,而不是变量。
这种情况下继承类的方法被调用
if 新的方法是隐藏的,则变量的类型决定那个方法被调用,而不是对象。
这种情况下基类的方法被调用
class abstract father
{
public abstract void go();
public virtual void show1()
{
Console.WriteLine("show1 in father");
}
public void show2()
{
Console.WriteLine("show2 in father");
}
}
class child : father
{
public void go()
{
Console.WriteLine("go in child");
}
//重写father.show1方法
public override void show1()
{
Console.WriteLine("show1 in child");
base.show1();
}
//隐藏father.show2方法
public new void show2()
{
Console.WriteLine("show2 in child");
base.show2();
}
}
class Entry
{
public static void Main()
{
child my_child = new child();
father my_father;
my_father = my_child;
my_father.go();
my_father.show1();
my_father.show2();
}
}
{
public abstract void go();
public virtual void show1()
{
Console.WriteLine("show1 in father");
}
public void show2()
{
Console.WriteLine("show2 in father");
}
}
class child : father
{
public void go()
{
Console.WriteLine("go in child");
}
//重写father.show1方法
public override void show1()
{
Console.WriteLine("show1 in child");
base.show1();
}
//隐藏father.show2方法
public new void show2()
{
Console.WriteLine("show2 in child");
base.show2();
}
}
class Entry
{
public static void Main()
{
child my_child = new child();
father my_father;
my_father = my_child;
my_father.go();
my_father.show1();
my_father.show2();
}
}
运行结果:
go in child
show1 in child
show1 in father
show2 in father