• C#中的abstract、virtual、override和new


    梳理一下static、abstract、virtual、override和new之间的关系

    ①static类里的所有成员都应该是static的,且不能被继承,static的方法也不能加abstract或virtual;

      但是在非static类里面的static方法可以在子类中被同名方法覆盖,

    //父类
    public class ClassBase
    {
        public static string A(){return "ClassBase.StaticA";}//父类静态方法
    }
    
    //子类
    public class ClassSon :ClassBase
    {
        public new string A()//使用new来覆盖,否则编译器提示警告,且该方法也可以申明为static
        {
            return "ClassSon.A";
        }
    }

      

    ②abstract的方法和属性必须包含在abstract的类中,abstract的方法不能有方法体,即不能有任何实现,而是在子类中实现,且子类中实现该方法时必须加override;

    //父类
    public abstract class ClassBase
    {
        public abstract string A();//不能包含实现,且必须是抽象类成员
    }
    
    //子类
    public class ClassSon:ClassBase
    {
        public override string A()//必须加override
        {
            return "Son.A";
        }
    }

    ②virtual的方法和属性有方法体,有自己的实现,可以在其子类中使用new或override来重写,其区别如下

    //父类
    public class ClassBase
    {
        public virtual string A()
        {
            return "ClassBase.A";
        }
    }
    
    //使用new的子类
    public class ClassSon1:ClassBase
    {
        public new string A()
        {
            return "ClassSon1.A";
        }
    }
    
    //使用override的子类
    public class ClassSon2:ClassBase
    {
        public override string A()
        {
            return "ClassSon2.A";
        }
    }
    
    //client代码
    public class Client
    {
        static void Main(string[] args)
        {
            ClassBase cb1 = new ClassSon1();
            ClassBase cb2 = new ClassSon2();
            Console.WriteLine(cb1.A());
            Console.WriteLine(cb2.A());
        }
    }

    运行结果为:

    ClassBase.A

    ClassSon2.A

    ③另外,没申明为virtual的方法,也可以在子类中使用new重写,效果跟上面第二点中使用new的效果一样,当然不使用new也可以,不过编译器会给出警告。

  • 相关阅读:
    TODO C++ lambda表达式
    C++ Map实践
    【转】C++ typedef typename 作用
    C++ Vector实践
    再学引用
    设置table中的td一连串内容自动换行
    JavaScript中基本数据类型和引用数据类型的区别
    “浏览器模式”和“文档模式”之间的区别
    浏览器模式与文档模式区别
    HTML5中的data-*属性和jQuery中的.data()方法使用
  • 原文地址:https://www.cnblogs.com/ArtofDesign/p/3603318.html
Copyright © 2020-2023  润新知