zoukankan      html  css  js  c++  java
  • C#里的重写,淦!

    先定义两个类

        public  class A
        {
            protected  void fun1()
            {
                fun2();
            }
    
            protected    virtual  void fun2()
            {
                Console.WriteLine("A.fun2");
            }
        }
    
        public  class B : A
        {
            public  void Test()
            {
                base.fun1();
            }
    
            protected   void fun2()
            {
                Console.WriteLine("B.fun2");
            }
        }
        public class Program
        {
            public static void Main(string[] args)
            {
                //  CreateHostBuilder(args).Build().Run();
    
                B model = new B();
                model.Test();
    
            }

    客官可猜输出是什么?

    答案:  A.fun2

    然而我们修改一下class.B的代码

            protected  new  void fun2()
            {
                Console.WriteLine("B.fun2");
            }
    增加 new 关键词,覆盖  A的fun2
    然而输出的结果还是 A.fun2
             protected   override  void fun2()
            {
                Console.WriteLine("B.fun2");
            }
    客官可猜输出是什么? B.fun2

    如果在java中,我们第一次的代码就直接输出 B.fun2 ,因为 java 中同名方法会重写 父类方法,但是C# 中必须明确的用虚方法和 override关键词来重写父类方法

     我们再次改一下class.B的代码

    public  class B : A
        {
            public void fun1()
            {
                base.fun1();
            }
    
            public   void fun2()
            {
                Console.WriteLine("B.fun2");
            }
        }
        public class Program
        {
            public static void Main(string[] args)
            {
                //  CreateHostBuilder(args).Build().Run();
    
                A model = new B();
                model.fun1();
    
            }

     改动的地方我给加粗了,词时输出的是什么?依然是  A.fun2

    再改 ,输出 B.fun2

    再改

     public  class B : A
        {
            public void fun1()
            {
                fun1();
            }
    
            public    void fun2()
            {
                Console.WriteLine("B.fun2");
            }
        }

     输出 A.fun2 

      public  class B : A
        {
            public void fun1()
            {
                fun1();
            }
    
            public  override   void fun2()
            {
                Console.WriteLine("B.fun2");
            }
        }

    输出 B.fun2

    得出一个结论,当子类重写了父类的方法后,当子类代替父类出现时都将使用子类的 方法,而不使用自己父类的方法

  • 相关阅读:
    PAT查找题---1032 挖掘机技术哪家强 (20分)
    PAT查找题---1028 人口普查 (20分)
    PAT查找题---1004 成绩排名 (20分)
    01_1JAVA简介
    01考试简介
    shell时间变量拼接问题
    如何将oracle查询的结果传输给变量
    生产环境邮件问题总结
    mutt+msmtp做linux邮件客户端
    linux配置邮件客户端
  • 原文地址:https://www.cnblogs.com/netqq/p/14606906.html
Copyright © 2011-2022 走看看