基础知识系列☞关键字→virtual
看到自己以前的一篇博客,感觉还差点什么,√,代码...
using System; namespace Test { public class Program { private static void Main(string[] args) { //调用... Dog dog = new Dog(); dog.VirtualMethod(); dog.NoVirtualMethod(); Console.Read(); } } #region 测试代码 /// <summary> /// 基类:动物 /// </summary> public class Animals { public virtual void VirtualMethod() { Console.WriteLine("父类→标记'virtual'的方法→VirtualMethod"); } public void NoVirtualMethod() { Console.WriteLine("父类→未标记'virtual'的方法→NoVirtualMethod"); } } /// <summary> /// 子类:汪星人 /// </summary> public class Dog : Animals { public override void VirtualMethod() { Console.WriteLine("子类→重写方法→VirtualMethod"); } /* /// <summary> /// 错误 CS0506 “Dog.NoVirtualMethod()”: 继承成员“Animals.NoVirtualMethod()”未标记为 virtual、abstract 或 override,无法进行重写 /// </summary> public override void NoVirtualMethod() { Console.WriteLine("子类→重写方法→NoVirtualMethod"); base.NoVirtualMethod(); } */ /// <summary> /// 警告 CS0108 “Dog.NoVirtualMethod()”隐藏继承的成员“Animals.NoVirtualMethod()”。如果是有意隐藏,请使用关键字 new。 /// </summary> public void NoVirtualMethod() { base.NoVirtualMethod();//base访问父类...扩展一下... Console.WriteLine("子类→未重写方法→NoVirtualMethod"); } //new public void NoVirtualMethod() //{ // Console.WriteLine("子类→new方法→NoVirtualMethod"); //} } #endregion }
上面代码结果:
由此可以看出↓
当基类[Animals]的方法[NoVirtualMethod]未标记为[virtual]的时候,
子类[Dog]中是没有办法[override]重写的...
提示:“Dog.NoVirtualMethod()”: 继承成员“Animals.NoVirtualMethod()”未标记为 virtual、abstract 或 override,无法进行重写
从智能提示中也可以看出来↓,没有提示[NoVirtualMethod]可以进行重写...
如上面代码那样[强行](已经出现警告了)在子类中写一个和父类同名的方法,调用的时候还是会显示使用子类的方法...
我理解的就是:子类和父类中的方法同名了,子类隐藏了父类的方法,推荐写法就是使用new
new public void NoVirtualMethod() { Console.WriteLine("子类→new方法→NoVirtualMethod"); }
xxx