基础知识系列☞关键字→virtual

时间:2023-03-08 18:22:06

看到自己以前的一篇博客,感觉还差点什么,√,代码...

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 }

上面代码结果:

基础知识系列☞关键字→virtual

由此可以看出↓

当基类[Animals]的方法[NoVirtualMethod]未标记为[virtual]的时候,

子类[Dog]中是没有办法[override]重写的...

提示:“Dog.NoVirtualMethod()”: 继承成员“Animals.NoVirtualMethod()”未标记为 virtual、abstract 或 override,无法进行重写

从智能提示中也可以看出来↓,没有提示[NoVirtualMethod]可以进行重写...

基础知识系列☞关键字→virtual

如上面代码那样[强行](已经出现警告了)在子类中写一个和父类同名的方法,调用的时候还是会显示使用子类的方法...

我理解的就是:子类和父类中的方法同名了,子类隐藏了父类的方法,推荐写法就是使用new

new public void NoVirtualMethod()
{
Console.WriteLine("子类→new方法→NoVirtualMethod");
}

xxx