隐藏基类方法
本质上来说,是隐藏子类中基类的方法,但在子类中仍然可以访问该功能。
示例如下:
namespace 隐藏基类和重写
{
public class Animal
{
public virtual void walk()
{
Console.WriteLine("Animal walk!");
}
}
public class Duck: Animal
{
new public void walk()
{
Console.WriteLine("Duck walk!");
}
}
class Program
{
static void Main(string[] args)
{
Animal animal;
Duck duck = new Duck();
animal = duck;
animal.walk();
duck.walk();
Thread.Sleep(100000);
}
}
}
执行结果为:
值得注意的是,若在子类Duck中不使用new,代码可以正常运行,但会生成一个警告如下,说明隐藏了一个基类成员。
警告 CS0114: “隐藏基类和重写.Duck.walk()”将隐藏继承的成员“隐藏基类和重写.Animal.walk()”。若要使当前成员重写该实现,请添加关键字 override。否则,添加关键字 new。
重写
本质上就是覆盖。若继承的成员是virtual,就可用override在子类中进行重写。
示例如下;
public class Animal
{
public virtual void walk()
{
Console.WriteLine("Animal walk!");
}
}
public class Duck: Animal
{
public override void walk()
{
Console.WriteLine("Duck walk!");
}
}
class Program
{
static void Main(string[] args)
{
Animal animal;
Duck duck = new Duck();
animal = duck;
animal.walk();
duck.walk();
Thread.Sleep(100000);
}
}
区别:
无论子类中要被继承的成员是否为虚拟的,都可以隐藏这些代码;重写的前提是子类中相应的成员必须是virtual。
无论是隐藏基类方法还是重写,都可以在子类内部访问基类成员。
在给继承的虚拟成员添加实现代码时,不建议简单的重写新实现代码替换,建议先调用base.walk()后再编写其他功能