• override new 关键字的区别


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace OverrideTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                A A = new A();
                B B = new B();
                C C = new C();
                D D = new D();

                A a = new A();
                A b = new B();
                A c = new C();
                A d = new D();

                B BC = new C();
                B BD = new D();
                C CD = new D();

                A AB = (A)B;
                A AC = (A)C;
                A AD = (A)D;

                Console.WriteLine("A =" + a.mode());
                Console.WriteLine("B =" + b.mode());
                Console.WriteLine("C =" + c.mode());
                Console.WriteLine("D =" + d.mode());
                Console.WriteLine("A =" + A.mode());
                Console.WriteLine("B =" + B.mode());
                Console.WriteLine("C =" + C.mode());
                Console.WriteLine("D =" + D.mode());
                Console.WriteLine("BC =" + BC.mode());
                Console.WriteLine("BD =" + BD.mode());
                Console.WriteLine("CD =" + CD.mode());
                Console.WriteLine("AD =" + AD.mode());
                Console.WriteLine("AB =" + AB.mode());
                Console.WriteLine("AC =" + AC.mode());
                Console.ReadLine();
            }
        }

        public class A
        {
            virtual public string mode()
            {
                return "A";
            }
        }
        public class B : A
        {
            public override string mode()
            {
                return "B";
            }
        }
        public class C : B
        {
            public virtual new string mode()
            {
                return "C";
            }
        }
        public class D : C
        {
            public override string mode()
            {
                return "D";
            }
        }


    }

    /*answer
     *
    A =A
    B =B
    C =B
    D =B
    A =A
    B =B
    C =C
    D =D
    BC =B
    BD =B
    CD =D
    AD =B
    AB =B
    AC =B
     *
     *
     */

    C# 语言经过专门设计,以便不同库中的基类与派生类之间的版本控制可以不断向前发展,同时保持向后兼容。这具有多方面的意义。例如,这意味着在基中引入与派生类中的某个成员具有相同名称的新成员在 C# 中是完全支持的,不会导致意外行为。它还意味着类必须显式声明某方法是要重写一个继承方法,还是一个隐藏具有类似名称的继承方法的新方法。

    在 C# 中,派生类可以包含与基类方法同名的方法。

    • 基类方法必须定义为 virtual

    • 如果派生类中的方法前面没有 newoverride 关键字,则编译器将发出警告,该方法将有如存在 new 关键字一样执行操作。

    • 如果派生类中的方法前面带有 new 关键字,则该方法被定义为独立于基类中的方法。

    • 如果派生类中的方法前面带有 override 关键字,则派生类的对象将调用该方法,而不是调用基类方法。

    • 可以从派生类中使用 base 关键字调用基类方法。

    • overridevirtualnew 关键字还可以用于属性、索引器和事件中。

    默认情况下,C# 方法为非虚方法。如果某个方法被声明为虚方法,则继承该方法的任何类都可以实现它自己的版本。若要使方法成为虚方法,必须在基类的方法声明中使用 virtual 修饰符。然后,派生类可以使用 override 关键字重写基虚方法,或使用 new 关键字隐藏基类中的虚方法。如果 override 关键字和 new 关键字均未指定,编译器将发出警告,并且派生类中的方法将隐藏基类中的方法。


     

  • 相关阅读:
    西卡编程教学 C语言教学视频(共32课更新完毕) 『 西卡教学 』 西卡学院 Powered by Pureing Labs!
    大图片新闻的体验还是不错的
    分享:用php抓取网页内容方法总结
    “深圳文献港”昨日正式开通_综合新闻_财经_腾讯网
    分享:EJDB 1.0.37 发布,嵌入式 JSON 数据库引擎
    分享:MetaModel 3.2.5 发布,数据库元模型
    RQ: Simple job queues for Python
    分享:开源主机项目 Ouya 发布 SDK
    RQ 简单的任务队列 品牌控
    信息论、推理与学习算法(翻译版)
  • 原文地址:https://www.cnblogs.com/zhaowt001/p/1338147.html
Copyright © 2020-2023  润新知