基础知识系列☞关键字→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

原文地址:https://www.cnblogs.com/love-zf/p/6484118.html