zoukankan      html  css  js  c++  java
  • 基础知识系列☞关键字→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

  • 相关阅读:
    Java volatile 关键字底层实现原理解析
    volatile关键字?MESI协议?指令重排?内存屏障?这都是啥玩意
    聊聊缓存一致性协议
    JIT原理
    java 泛型详解
    Java中的逆变与协变
    疯狂的String
    java中synchronized与Lock的异同
    不使用的大对象为什么要手动设置null,真的有效吗?
    不使用反射如何调用某个实例对象的方法
  • 原文地址:https://www.cnblogs.com/love-zf/p/6484118.html
Copyright © 2011-2022 走看看